Обработка ошибок PHP DOMDocument
В своем приложении я загружаю xml из URL-адреса, чтобы проанализировать его. Но иногда этот URL-адрес может быть недействительным. В этом случае мне нужно обрабатывать ошибки. У меня есть следующий код:
$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
}
Я знаю, что, вероятно, делаю это неправильно, но как правильно обрабатывать такого рода исключения? Я не хочу видеть сообщения об ошибках на своей странице.
В руководстве по DOMDocument::load() говорится:
Если в качестве имени файла передается пустая строка или имя пустого файла, будет сгенерировано предупреждение. Это предупреждение не генерируется libxml и не может быть обработано с помощью функций обработки ошибок libxml.
Но нет никакой информации о том, как с этим справиться.
Спасибо.
5 answers
Из того, что я могу почерпнуть из документации , обработка предупреждений, выдаваемых этим методом, является сложной задачей, поскольку они не генерируются расширением libxml и, следовательно, не могут быть обработаны libxml_get_last_error()
. Вы можете либо использовать оператор подавления ошибок, либо проверить возвращаемое значение для false
...
if (@$xdoc->load($url) === false)
// ...handle it
...или зарегистрируйте обработчик ошибок, который создает исключение при ошибке:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
А затем поймай его.
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();
Это работает для меня в PHP 5.3. Но если вы не используете loadXML
, вам может потребоваться внести некоторые изменения.
Чтобы отключить ошибки при выбрасывании:
$internal_errors = libxml_use_internal_errors(true);
$dom = new DOMDocument();
// etc...
libxml_use_internal_errors($internal_errors);
Из php.net
Если в качестве имени файла передается пустая строка или указывается имя пустого файла, будет сгенерировано предупреждение. Это предупреждение не генерируется libxml и не может быть обработано с помощью функций обработки ошибок libxml.
В вашей производственной среде пользователю не должны отображаться ошибки. Им не нужно их видеть, поэтому, принимая это во внимание, вы можете использовать...
$xdoc = new DOMDocument();
if ( $xdoc->load($url) ) {
// valid
}
else {
// invalid
}
Для меня следование сделало свое дело
$feed = new DOMDocument();
$res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss');
if($res==1){
//do sth
}