2010-01-25 6 views

Antwort

63

Sicher, nur die Ausnahme abfangen, wo Sie die Ausführung fortsetzen wollen ...

try 
    { 
     SomeOperation(); 
    } 
    catch (SomeException $e) 
    { 
     // do nothing... php will ignore and continue  
    } 

Natürlich ist dies das Problem der leise fallen hat, was ein sehr wichtiger Fehler sein könnte. SomeOperation() kann möglicherweise andere subtile Probleme verursachen, die schwierig zu lösen sind, aber Sie würden nie wissen, ob Sie die Ausnahme stillschweigend löschen.

+0

Gah! Beat mich um 21 Sekunden. –

+4

Wenn ich hinzufügen könnte: eine Ausnahme zu fangen, ohne etwas im catch-Block zu tun, wird als schlechter Stil betrachtet, Sie sollten zumindest eine Protokollausgabe schreiben (oder, wie in dem Beispiel, einen Kommentar liefern, der wirklich nicht wirklich sein muss) erledigt). Dies gilt insbesondere, wenn Sie _any_ Exception mit catch (Exception $ ex) {} – dbemerlin

+1

fangen, also wie loggen Sie es ein und fahren Sie fort? – numerical25

13

Sure:

try { 
    throw new Exception('Something bad'); 
} catch (Exception $e) { 
    // Do nothing 
} 

Vielleicht möchten Sie eine Lese der PHP-Dokumentation auf Exceptions gehen.

+3

+1 für den Vorschlag, das Handbuch zu lesen. – GZipp

+0

Dies wird eine neue Exception werfen, die jetzt vom try-Block abgefangen wird, führt zu einer nicht abgefangenen Exception –

+1

@JakeN nicht wahr. Da die geworfene Ausnahme vom 'catch'-Block abgefangen wird, kann ** niemals ** zu einer nicht abgefangenen Ausnahme führen. – Pere

5

Ja.

try { 
    Somecode(); 
catch (Exception $e) { 
    // handle or ignore exception here. 
} 

jedoch beachten, dass PHP auch Fehlercodes getrennt von Ausnahmen hat, ein Vermächtnis Überbleibsel aus der Zeit vor php oop Primitiven hatte. Die meisten eingebauten Bibliotheken erzeugen immer noch Fehlercodes, keine Ausnahmen. So ignorieren Sie einen Fehlercode Aufruf der Funktion mit @ vorangestellt:

@myfunction(); 
98

Ja, aber es hängt davon ab, was Sie ausführen möchten:

Z.B.

try { 
    a(); 
    b(); 
} 
catch(Exception $e){ 
} 

c(); 

c() wird immer ausgeführt. Aber wenn a() eine Ausnahme auslöst, wird b()nicht ausgeführt.

Nur die Sachen in den try Block, der voneinander abhängig ist. Z.B. b hängt von einem Ergebnis von a ab Es macht keinen Sinn b nach dem try-catch Block zu setzen.

+0

Wenn ich noch irgendwelche Stimmen hätte, würde ich es auf dieses setzen ... :) –

+0

Ich tat in Ihrem Namen :) –

+2

'$ e' muss' \ Exception $ e' oder ähnlich oder ein Parse-Fehler sein geworfen – iautomation

0

Ein anderer Winkel dazu ist, eine Ausnahme zurückzugeben, NICHTS, aus dem Verarbeitungscode zu werfen.

Ich musste dies mit einem Templating Framework tun, das ich schreibe. Wenn der Benutzer versucht, auf eine Eigenschaft zuzugreifen, die nicht in den Daten vorhanden ist, gibt I den Fehler aus der Tiefe der Verarbeitungsfunktion zurück, anstatt ihn zu werfen.

Dann wird in der Telefonvorwahl, kann ich entscheiden, ob dieser Fehler zurückgegeben werfen, was den Versuch() zu fangen() oder einfach weiter:

// process the template 
    try 
    { 
     // this function will pass back a value, or a TemplateExecption if invalid 
      $result = $this->process($value); 

     // if the result is an error, choose what to do with it 
      if($result instanceof TemplateExecption) 
      { 
       if(DEBUGGING == TRUE) 
       { 
        throw($result); // throw the original error 
       } 
       else 
       { 
        $result = NULL; // ignore the error 
       } 
      } 
    } 

// catch TemplateExceptions 
    catch(TemplateException $e) 
    { 
     // handle template exceptions 
    } 

// catch normal PHP Exceptions 
    catch(Exception $e) 
    { 
     // handle normal exceptions 
    } 

// if we get here, $result was valid, or ignored 
    return $result; 

Das Ergebnis davon ist, ich immer noch der Kontext des ursprünglichen Fehlers, obwohl es an der Spitze geworfen wurde.

Eine andere Option könnte sein, ein benutzerdefiniertes NullObject oder ein UnknownProperty -Objekt zurückzugeben und damit zu vergleichen, bevor Sie die catch() auslösen, aber Sie können trotzdem Fehler erneut werfen, und wenn Sie die Kontrolle über die Insgesamt denke ich, dass dies ein guter Weg ist, um nicht weiter versuchen zu können.

0

Eine alte Frage, aber ich hatte in der Vergangenheit, wenn Sie von VBA-Skripten zu PHP, wo Sie uns "GoTo", um wieder in eine Schleife "On Error" mit einem "Resume" und weg ging es ging Verarbeitung der Funktion.
In php, nach ein wenig Versuch und Irrtum, verwende ich jetzt verschachtelte try {} catch {} für kritische oder nicht kritische Prozesse oder sogar für voneinander abhängige Klassenaufrufe, so dass ich meinen Weg zurück zum Anfang des Fehlers verfolgen kann. z.B. wenn die Funktion b auf Funktion ein abhängig ist, sondern Funktion c ist ein schön zu haben, sollte aber nicht den Prozess stoppen, und ich will noch die Ergebnisse aller drei unabhängig wissen, hier ist, was ich tue:

//set up array to capture output of all 3 functions 
$resultArr = array(array(), array(), array()); 

// Loop through the primary array and run the functions 
foreach($x as $key => $val) 
{ 
    try 
    { 
     $resultArr[$key][0][] = a($key); 
     $resultArr[$key][1][] = b($val); 
     try 
     { // If successful, output of c() is captured 
      $resultArr[$key][2][] = c($key, $val); 
     } 
     catch(Exception $ex) 
     { // If an error, capture why c() failed 
      $resultArr[$key][2][] = $ex->getMessage(); 
     } 
    } 
    catch(Exception $ex) 
    { // If critical functions a() or b() fail, we catch the reason why 
     $criticalError = $ex->getMessage(); 
    } 
} 

Jetzt Ich kann mein Ergebnis-Array für jeden Schlüssel durchlaufen und die Ergebnisse bewerten. Wenn ein kritischer Fehler für a() oder b() auftritt.
Ich habe immer noch einen Bezugspunkt, wie weit es gekommen ist, bevor ein kritischer Fehler innerhalb der $ resultArr aufgetreten ist und wenn der Ausnahmebehandler richtig eingestellt ist, weiß ich, ob es ein() oder b() war, die fehlgeschlagen sind.
Wenn c() fehlschlägt, wird die Schleife fortgesetzt. Wenn c() an verschiedenen Stellen fehlschlägt, kann ich mit ein wenig zusätzlicher Post-Loop-Logik sogar herausfinden, ob c() gearbeitet hat oder bei jeder Iteration einen Fehler hatte, indem $ resultArr [$ key] [2] abgefragt wurde.

Verwandte Themen