Mak*_*Vi. 21 php xml error-handling dom exception
在我的应用程序中,我从url加载xml以解析它.但有时这个网址可能无效.在这种情况下,我需要处理错误.我有以下代码:
$xdoc = new DOMDocument();
try{
$xdoc->load($url); // This line causes Warning: DOMDocument::load(...)
// [domdocument.load]: failed to open stream:
// HTTP request failed! HTTP/1.1 404 Not Found in ...
} catch (Exception $e) {
$xdoc = null;
}
if($xdoc == null){
// Handle
} else {
// Proceed
}
Run Code Online (Sandbox Code Playgroud)
我知道我可能做错了,但是处理这种异常的正确方法是什么?我不想在我的页面上看到错误消息.
DOMDocument :: load()的手册说:
如果作为文件名传递空字符串或命名空文件,则将生成警告.此警告不是由libxml生成的,无法使用libxml的错误处理函数进行处理.
但是没有关于如何处理它的信息.
谢谢.
Øys*_*sen 35
根据我从文档中收集的内容,处理此方法发出的警告很棘手,因为它们不是由libxml扩展生成的,因此无法处理libxml_get_last_error().您可以使用错误抑制运算符并检查返回值false...
if (@$xdoc->load($url) === false)
// ...handle it
Run Code Online (Sandbox Code Playgroud)
...或者注册一个错误处理程序,它会在出错时抛出异常:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
Run Code Online (Sandbox Code Playgroud)
抓住它.
set_error_handler(function($number, $error){
if (preg_match('/^DOMDocument::loadXML\(\): (.+)$/', $error, $m) === 1) {
throw new Exception($m[1]);
}
});
$xml = new DOMDocument();
$xml->loadXML($xmlData);
restore_error_handler();
Run Code Online (Sandbox Code Playgroud)
这在PHP 5.3中适用于我.但是如果你不使用loadXML,你可能需要做一些修改.
要禁用抛出错误:
$internal_errors = libxml_use_internal_errors(true);
$dom = new DOMDocument();
// etc...
libxml_use_internal_errors($internal_errors);
Run Code Online (Sandbox Code Playgroud)