未捕获 PHP 中的 XML 异常


XML Exception in PHP not being caught

我的代码片段如下 - 如您所见,我有一个 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";        
}