Обработка ошибок PHP DOMDocument - PullRequest
20 голосов
/ 19 ноября 2009

В моем приложении я загружаю 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 ]

35 голосов
/ 19 ноября 2009

Из того, что я могу почерпнуть из документации , обработка предупреждений, выданных этим методом, довольно сложна, поскольку они не генерируются расширением 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);
}

, а затем поймать его.

7 голосов
/ 24 марта 2011
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, возможно, вам придется внести некоторые изменения.

4 голосов
/ 19 сентября 2011

Чтобы отключить выбрасывание ошибок:

$internal_errors = libxml_use_internal_errors(true);

$dom = new DOMDocument();
// etc...

libxml_use_internal_errors($internal_errors);
2 голосов
/ 19 ноября 2009

с php.net

Если пустая строка передается как имя файла или пустой файл, предупреждение будет сгенерировано. это предупреждение не генерируется libxml и не может быть обработан с использованием ошибки libxml функции обработки.

В вашей производственной среде не должно отображаться ошибок пользователю. Им не нужно их видеть, поэтому, учитывая это, вы можете использовать ...

$xdoc = new DOMDocument();
if ( $xdoc->load($url) ) {
    // valid
}
else {
    // invalid
}
0 голосов
/ 30 июня 2014

Для меня, следующий сделал трюк

$feed = new DOMDocument();  
$res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss');
if($res==1){
           //do sth
          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...