2009-11-18 12 views
18

In meiner Anwendung lade ich XML von URL, um es zu analysieren. Aber manchmal ist diese URL möglicherweise nicht gültig. In diesem Fall muss ich mit Fehlern umgehen. Ich habe den folgenden Code:PHP DOMDocument Fehlerbehandlung

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

Ich weiß, dass ich es wahrscheinlich falsch zu machen, aber was ist ein richtiger Weg, um diese Art von Ausnahmen zu behandeln? Ich möchte keine Fehlermeldungen auf meiner Seite sehen.

Das Handbuch für DOMDocument :: load() sagt:

Wenn eine leere Zeichenfolge als Dateinamen geben wird oder eine leere Datei mit dem Namen ist, wird eine Warnung generiert werden. Diese Warnung wird nicht von libxml generiert und kann nicht mit libxml Fehler Handling-Funktionen behandelt werden.

Aber es gibt keine Informationen darüber, wie man damit umgeht.

Danke.

Antwort

32

Von dem, was ich aus der documentation erfassen kann, ist die Handhabung von Warnungen, die von dieser Methode ausgegeben werden, schwierig, da sie nicht von der libxml-Erweiterung erzeugt werden und somit nicht von libxml_get_last_error() gehandhabt werden können. Sie könnte entweder die Fehlerunterdrückungsoperator und überprüfen Sie den Rückgabewert für false ...

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

... oder registrieren 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); 
} 

und dann fangen.

+0

Dank für Bedienungsfehler Unterdrückung. –

+1

Sie können auch libxml_use_internal_errors (false) verwenden, um den Fehler zu unterdrücken und die Daten auf Fehler zu überprüfen – Ligemer

2

Von php.net

Wenn eine leere Zeichenfolge als Dateiname übergeben wird oder eine leere Datei mit dem Namen ist, eine Warnung generiert. Diese Warnung wird nicht von libxml generiert und kann nicht mit libxml Fehler Handling-Funktionen behandelt werden.

In Ihrer Produktionsumgebung sollten dem Benutzer keine Fehler angezeigt werden. Sie brauchen sie nicht so dies berücksichtigend sehen Sie verwenden können ...

$xdoc = new DOMDocument(); 
if ($xdoc->load($url)) { 
    // valid 
} 
else { 
    // invalid 
} 
7
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(); 

, die für mich in PHP 5.3 funktioniert. Aber wenn Sie nicht loadXML verwenden, müssen Sie möglicherweise einige Änderungen vornehmen.

+1

Awesomeness in diesem Beitrag ist zu verdammt hoch! – Sebas

+0

Ich benutze loadXML, hilft aber immer noch nicht ... :( –

+0

@Znarkus Ich glaube, dass die aktuelle Lösung einen kleinen Fehler enthält. Damit dieser Code keine Nebenwirkungen hat, muss der benutzerdefinierte Error - Handler aus der stack * unabhängig davon, ob 'loadXML()' ohne Fehler abgeschlossen wurde Wenn 'loadXML()' einen Fehler ausgibt, der vom benutzerdefinierten Fehlerhandler abgefangen wird, wird 'restore_error_handler(); 'nie aufgerufen bleiben in Kraft - was wir fast sicher nicht wollen. Um dies zu beheben, würde ich vorschlagen, einen Aufruf an 'restore_error_handler();' in der 'if'-Anweisung der Schließung, direkt bevor die Ausnahme zu werfen. – Nate

4

deaktivieren Fehlern werfen:

$internal_errors = libxml_use_internal_errors(true); 

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

libxml_use_internal_errors($internal_errors); 
+4

Lesen Sie das Handbuch Diese Warnung wird nicht von libxml generiert und kann nicht mit den Fehlerbehandlungsfunktionen von libxml behandelt werden –

+1

Funktioniert perfekt, wenn sie mit 'libxml_get_last_error()' verwendet wird. – BurninLeo

0

Für mich den Trick folgenden

$feed = new DOMDocument(); 
$res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss'); 
if($res==1){ 
      //do sth 
      }