MyBB.de Forum

Normale Version: [PHP] Fehler in der Fehlerbehandlung?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
[MyBB 1.4]

Hi Leutz,

stehe grad vor einem Problem, und habe entweder einen Denkfehler drin, oder seh den Fehler vor lauter Code nicht Tongue

Grundidee:
Ich möchte nen Script erstellen, dass es bestimmten Usern aus meinem Forum erlaubt, spezielle Dateien hochzuladen. Diese Dateien besitzen einen XML-Header, den ich auslesen und auswerten will. Soweit so gut.

Aktueller Code:
PHP-Code:
function upload_track($file) {

/* Zu Beginn wird die Datei auf dem Webspace gespeichert und grundlegende Dinge überprüft. Soll hier aber nicht interessieren. 
$upload ist das Array, was von upload_file() [inc/functions_upload.php] zurückgegeben wird */

    // Dateiinhalt auslesen
    
$handle  fopen($upload['path'].'/'.$upload['filename'], 'r');
    
$content fread($handle$upload['size']);
    
fclose($handle);

    
// XML-Header der Streckendatei extrahieren
    
$start  strpos($content"<header");
    
$ende   strpos($content"</header>") + 9;
    
$header substr($content$start$ende $start);
    
    
// Hier wird dann alles reingeschrieben
    
$track = array()

    
// Ausgelesene Daten auswerten
    
try {
        
$xml = new SimpleXMLElement($header);
        
/* Hier lese ich nun die XML-Header-Daten aus und überprüfe diese.
Dabei werfe ich selbst Fehler, wenn etwas nicht stimmen sollte und die Datei somit nicht angenommen werden kann. 
Nachfolgend einfach ein Beispiel, wie diese Überprüfungen aussehen */
        
if ((string) $xml['type'] != "challenge") {
            throw new 
Exception($lang->error_gbxtype6);
        }
        
        
/* [...] */
        
return $track;
    } catch (
Exception $e) {
        
// Irgendwas hat einen Fehler ausgelöst, also löschen wir die ungültige Datei wieder
        
unlink($upload['path'].'/'.$upload['filename']);
        
// Fehler zurückgeben
        
return array(
            
'error'     => $e->getMessage(),
            
'errorcode' => $e->getCode()
        );
    } 

Das Problem:
Wenn ich nun eine Datei mit fehlerhaften XML-Header hochlade (syntaktisch nicht korrekt, oder gar nicht vorhanden), so wirft "new SimpleXMLElement($header)" ja einen Fehler (logischerweise). Dieser wird von dem Catch allerdings nicht abgefangen, sondern wird am Ende von MyBB formatiert ausgegeben.

Kann mir jemand sagen, wie ich erfolgreich die Fehler des SimpleXMLElements abfangen kann, one dass mir MyBB dazwischen pfuscht?

(Als ich das Script noch nicht direkt mit MyBB verbunden hatte, wurde der Fehler abgefangen, seitdem ich das aber jetzt in das MyBB integriert habe, funktioniert das Ding nicht mehr Sad )

MfG Zwoetzen

EDIT:
Was ich gerade festgestellt habe:
Obwohl vom MyBB den Fehler abzufangen scheint und die Meldungen formatiert ausgibt, scheint trotzdem meine Fehlerbehandlung durchzulaufen, denn das Script reagiert so, wie es reagieren soll:
Datei wird gelöscht,
Meine eigene Fehlermeldung wird erfolgreich für den User ausgegeben.
Versuche, mit set_error_handler oder set_exception_handler temporär einen eigene ErrorHandling Funktion zu bestimmen.

Nach deinem Code stelle wieder den mybb-errorhandler her:
PHP-Code:
if(version_compare(PHP_VERSION">=""5"))
{
   
set_error_handler(array(&$error_handler"error"), array_diff($error_handler->error_types$error_handler->ignore_types));
}
else
{
    
set_error_handler(array(&$error_handler"error"));

(Code teilweise aus /inc/class_error.php)
Danke für deine Antwort Regular

Hatte gestern auch nochmal selbst nach einer Lösung im INet gesucht, und hab dann irgendwo gelesen, dass man mit einem @ vor dem new die Warnings unterdrücken kann (und bei dem XML-Objekt kamen nur Warnings raus, sodass es eben nun passt)
Habe also nun einfach die eine Zeile abgeändert zu:
PHP-Code:
$xml = @new SimpleXMLElement($header); 

Trotzdem Danke für deine Antwort, vielleicht brauch ich das mit dem Error/Exception Handler woanders mal Wink
solltest du dennoch nicht machen das ist ja nicht sin und zweck der sache, lieber solltest du die fehler beheben... denn nur weil er nicht mehr zu sehen ist heist das nicht das er nicht noch da ist...

das kann auch sehr gefärlich werden