PHP DOMDocument hata işleme

4 Cevap php

In my application I am loading xml from url in order to parse it. But sometimes this url may not be valid. In this case I need to handle errors. I have the following code:

$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
}

Ben muhtemelen yanlış yapıyor biliyorum, ama istisnalar bu tür işlemek için doğru yolu nedir? Ben sayfamda hata iletileri görmek istemiyorum.

DOMDocument :: load () için manuel diyor ki:

If an empty string is passed as the filename or an empty file is named, a warning will be generated. This warning is not generated by libxml and cannot be handled using libxml's error handling functions.

Ama nasıl hallederim hakkında bilgi yoktur.

Teşekkürler.

4 Cevap

Onlar libxml uzantısı tarafından oluşturulur ve böylece tarafından ele alınamaz, çünkü ne bu yöntem tarafından verilen uyarılar taşıma, documentation toplayabilir zor gelen libxml_get_last_error(). Sen hata bastırma operatörü kullanın ve için dönüş değerini kontrol edebilir ya false ...

if (@$xdoc->load($url) === false)
    // ...handle it

... Veya kayıt an error handler which throws an exception on error:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

ve sonra onu yakalamak.

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();

Yani PHP 5.3 benim için çalışıyor. Ama kullanmıyor iseniz loadXML, bazı değişiklikler yapmanız gerekebilir.

Php.net Gönderen

If an empty string is passed as the filename or an empty file is named, a warning will be generated. This warning is not generated by libxml and cannot be handled using libxml's error handling functions.

Üretim ortamında size kullanıcıya görüntülenen hataları olmamalıdır. Onları böylece kullanabilirsiniz dikkate alarak bu görmek gerek yok ...

$xdoc = new DOMDocument();
if ( $xdoc->load($url) ) {
    // valid
}
else {
    // invalid
}

Hatalar atma devre dışı bırakmak için:

$internal_errors = libxml_use_internal_errors(true);

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

libxml_use_internal_errors($internal_errors);