2014-12-17 3 views
1

Ниже приведен фрагмент кода - как вы можете видеть, у меня есть блок try-catch, но, несмотря на это, я все же получаю неперехваченное исключение, которое завершает все приложение. Что мне не хватает?XML Исключение в PHP не поймано

try { 
    $cakeXml = simplexml_load_string($xml); 
    $parseSuccess = $cakeXml->xpath('//ParseSuccess'); 
} catch (Exception $ex) { 
    $response['parseSuccess'] = false; 
    $response['errors']['ParseError'] = 'An unknown error occurred while trying to parse the file. Please try again'; 
    return $response;  
} 

2014-12-16 22:45:12 Error: Fatal Error (1): Call to a member function xpath() on a non-object 
2014-12-16 22:45:12 Error: [FatalErrorException] Call to a member function xpath() on a non-object 

ответ

2

Если прочитать сообщение об ошибке более-внимательно, вы увидите, что она не умирает на Exception, но на Fatal Error. A try/catch заявление не может обнаружить фатальную ошибку в PHP, так как нет возможности восстановить фатальную ошибку.

Что касается решения этой проблемы, ваша ошибка говорит вам, что $cakeXml является не объектом. Одним из решений было бы сделать что-то подобное.

try { 
    $cakeXml = simplexml_load_string($xml); 
    if (!is_object($cakeXml)) { 
     throw new Exception('simplexml_load_string returned non-object'); 
    } 
    $parseSuccess = $cakeXml->xpath('//ParseSuccess'); 
} catch (Exception $ex) { 
    $response['parseSuccess'] = false; 
    $response['errors']['ParseError'] = 'An unknown error occurred while trying to parse the file. Please try again'; 
    return $response;  
} 
+0

Хм .. ок спасибо - следовать на вопрос - как я могу заставить метод тайм-аут или бросить курить, если возникает неустранимая ошибка? Сейчас приложение зависает, и пользователь остается в ожидании ответа. Или это невозможно? – ChicagoSky

+0

@ChicagoSky Я добавил способ обработки этого конкретного случая, проверяя, является ли '$ cakeXml' не объектом. –

0

Методы DOMXPath, т.е. xpath или оценка не порождают исключения. Следовательно, вам нужно будет явно проверить и выбросить исключение.

Смотрите ниже фрагменте кода:

$xml_1= ""; 

try {  
    $cakeXml = simplexml_load_string($xml_1);   
    if (!is_object($cakeXml)) { 
     throw new Exception(sprintf('Not an object (Object: %s)', var_export($cakeXml, true))); 
    } else {   
     $parseSuccess = $cakeXml->xpath('//pages');     
     print('<pre>');print_r($parseSuccess); 
    } 
} catch (Exception $ex) { 
    echo 'Caught exception: ', $ex->getMessage(), "\n";   
} 
Смежные вопросы