我的代码片段如下 - 如您所见,我有一个 try-catch 块,但尽管如此,我仍然得到一个未捕获的异常,终止整个应用程序。我错过了什么?
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
如果您更仔细地阅读错误消息,您会发现它不是在Exception
上死亡,而是在Fatal Error
上死亡。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;
}
DOMXPath 方法即 xpath 或 evaluate 不会抛出异常。因此,您需要显式验证并引发异常。
请参阅下面的代码片段:
$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";
}