2009-08-20 16 views
17

ich den folgenden Code verwenden:simplexml Fehler php Umgang

function GetTwitterAvatar($username){ 
$xml = simplexml_load_file("http://twitter.com/users/".$username.".xml"); 
$imgurl = $xml->profile_image_url; 
return $imgurl; 
} 

function GetTwitterAPILimit($username, $password){ 
$xml = simplexml_load_file("http://$username:[email protected]/account/rate_limit_status.xml"); 
$left = $xml->{"remaining-hits"}; 
$total = $xml->{"hourly-limit"}; 
return $left."/".$total; 
} 

und diese Fehler bekommen, wenn der Strom nicht verbinden kann:

Warning: simplexml_load_file(http://twitter.com/users/****.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable 

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://twitter.com/users/****.xml" 

Warning: simplexml_load_file(http://[email protected]/account/rate_limit_status.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable 

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://***:***@twitter.com/account/rate_limit_status.xml" 

Wie kann ich diese Fehler umgehen, damit ich einen Benutzer angezeigt werden kann freundliche Nachricht anstelle dessen, was oben gezeigt wird?

+0

Betrachten Sie die gewählte Antwort zu ändern? Die Frage lautet: "Wie kann ich mit diesen Fehlern umgehen?"Die gewählte Antwort sagt Ihnen nur, wie zu vermeiden, mit –

Antwort

42

ich denke dies ein besserer Weg ist

$use_errors = libxml_use_internal_errors(true); 
$xml = simplexml_load_file($url); 
if (false === $xml) { 
    // throw new Exception("Cannot load xml source.\n"); 
} 
libxml_clear_errors(); 
libxml_use_internal_errors($use_errors); 

weitere Informationen: http://php.net/manual/en/function.libxml-use-internal-errors.php

+1

Nur einer, der die Frage beantwortet. Verwenden Sie es mit 'libxml_get_errors()' oder 'libxml_get_last_error()', um die Fehlermeldung (en) zu erhalten. – Znarkus

+1

Dies kann jedoch nicht alle Warnungen von Simplexml_load_file ausgegeben werden. –

+0

Ich habe dies versucht, aber eine Warnmeldung erhalten, also habe ich einfach $ xml = @simplexml_load_file ($ url); und keine Warnungen und behandelt Fehler wie erwartet – bestprogrammerintheworld

0

Die Dokumentation besagt, dass im Falle eines Fehlers simplexml_load_file FALSE zurückgibt. So können Sie den "shut-up" Operator (@) in Kombination mit einer bedingten Anweisung verwenden: (! Simplexml_load_file ($ file) == falsch)

if (@simplexml_load_file($file)) 
{ 
    // continue 
} 
else 
{ 
    echo 'Error!'; 
} 
+17

Nicht das Shut-up nicht zum Schweigen bringen, bitte –

+0

so etwas wie dieses Funktion GetTwitterAvatar ($ username) { if (@simplexml_load_file (.!?" Http: //twitter.com/users/".$ Benutzername. ". xml")) { $ xml = simplexml_load_file ("http://twitter.com/users/". $ username. ".xml"); $ imgurl = $ xml-> profile_image_url; return $ imgurl; } else { return 'Fehler'; } } – mrpatg

+2

Sie können es tun simplexml_load_file zweimal ohne Aufruf: $ xml = @simplexml_load_file ("..."); if ($ xml) {...} else {gibt 'Error' zurück;} –

-1

wenn { // fortsetzen} else { echo 'Fehler!'; }

Und Twitter is down, vielleicht?

+0

Twitter ist down ist down! – Znarkus

+5

-1, Sie behandeln nicht wirklich Fehler. – greg0ire

14

ich ein schönes Beispiel in der php documentation gefunden haben.

So ist der Code:

libxml_use_internal_errors(true); 
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>"); 
if (false === $sxe) { 
    echo "Failed loading XML\n"; 
    foreach(libxml_get_errors() as $error) { 
     echo "\t", $error->message; 
    } 
} 

Und die Ausgabe, wie wir/ich erwartet hatte:

fehlgeschlagen Laden von XML

Blank needed here 
parsing XML declaration: '?>' expected 
Opening and ending tag mismatch: xml line 1 and broken 
Premature end of data in tag broken line 1 
+2

Dies kann jedoch nicht alle Warnmeldungen von Simplexml_load_string ausgegeben werden. –

6

Wenn Sie schau auf das ma nual gibt es einen Optionsparameter:

SimpleXMLElement simplexml_load_file (string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]]) 

Liste Optionen zur Verfügung: http://www.php.net/manual/en/libxml.constants.php

Dies ist der richtige Weg, Warnungen Parsen Warnungen zu unterdrücken:

$xml = simplexml_load_file('file.xml', 'SimpleXMLElement', LIBXML_NOWARNING); 
+0

Hat bei mir nicht funktioniert, generierte noch ein E_WARNING in PHP 5.4.x –

2

Dies ist eine alte Frage, aber ist heute noch relevant.

Der korrekte Umgang mit Ausnahmen bei der Verwendung des OOP SimpleXMLElment ist wie folgt.

libxml_use_internal_errors(TRUE); // this turns off spitting errors on your screen 
try { 
    $xml = new SimpleXMLElement($xmlStringOfData); 
} catch (Exception $e) { 
    // Do something with the exception, or ignore it. 
} 
1

Mein kleiner Code:

try { 
    libxml_use_internal_errors(TRUE); 
    $xml = new SimpleXMLElement($xmlString); 
    echo '<pre>'.htmlspecialchars($xml->asXML()).'</pre>'; 
} catch (Exception $e) { 
    echo 'Caught exception: ' . $e->getMessage() . chr(10); 
    echo 'Failed loading XML: ' . chr(10); 
    foreach(libxml_get_errors() as $error) { 
     echo '- ' . $error->message; 
    } 
} 

Ergebnis Beispiel:

Caught exception: String could not be parsed as XML 
Failed loading XML: 
- Opening and ending tag mismatch: Body line 3 and Bod-y