Ist es möglich, eine Ausnahme abzufangen und die Ausführung des Skripts fortzusetzen?php: Ausnahme abfangen und Ausführung fortsetzen, ist das möglich?
Antwort
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.
Sure:
try {
throw new Exception('Something bad');
} catch (Exception $e) {
// Do nothing
}
Vielleicht möchten Sie eine Lese der PHP-Dokumentation auf Exceptions gehen.
+1 für den Vorschlag, das Handbuch zu lesen. – GZipp
Dies wird eine neue Exception werfen, die jetzt vom try-Block abgefangen wird, führt zu einer nicht abgefangenen Exception –
@JakeN nicht wahr. Da die geworfene Ausnahme vom 'catch'-Block abgefangen wird, kann ** niemals ** zu einer nicht abgefangenen Ausnahme führen. – Pere
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();
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.
Wenn ich noch irgendwelche Stimmen hätte, würde ich es auf dieses setzen ... :) –
Ich tat in Ihrem Namen :) –
'$ e' muss' \ Exception $ e' oder ähnlich oder ein Parse-Fehler sein geworfen – iautomation
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.
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.
- 1. Python Map-Ausnahme Fortsetzen Mapping-Ausführung
- 2. Bytebuddy abfangen Ausnahme throw
- 3. SetUnhandledExceptionFilter: Ausführung fortsetzen 1 Opcode weiter
- 4. Ist das in PHP möglich?
- 5. Ausnahme beim InstallUtil-Workflow abfangen
- 6. Stoppt eine PHP-Ausnahme die Ausführung?
- 7. Abfangen von NSKeyedUnarchiver-Ausnahme
- 8. Werfen (und Abfangen) Ausnahme in anonymer Methode
- 9. PHP-Backend, Java-Frontend. Ist das möglich?
- 10. Ausnahme im Kontextmanager abfangen __enter __()
- 11. Abfangen einer Laufzeitausnahme in PHP
- 12. Hadoop und Django, ist das möglich?
- 13. Junit assert.fail() -Methode wird gestoppt, die Ausführung, muss die Ausführung fortsetzen und geben Sie am Ende
- 14. Können Sie Ausnahme innerhalb von Application.DoEvents() abfangen?
- 15. Fortsetzen der Ausführung an beliebigen Positionen innerhalb einer Callback-Funktion
- 16. Ist PHP Pufferüberlauf möglich?
- 17. PHP - Uncaught SoapFault Ausnahme - wie man es ignoriert und While-Schleife fortsetzen?
- 18. Unity Abfangen und Konstrukteure
- 19. Abfangen eines Azure WebJob-Fehlers/Ausnahme
- 20. Wie kann man die Ausnahme in R abfangen, um die Ausführung des Programms nicht zu stoppen?
- 21. Ausnahme beim Speichern in Django admin abfangen?
- 22. Ausnahme von AsyncTask abfangen. Denken Sie benötigen
- 23. MongoDB Query - ist das möglich?
- 24. Ausführung nur fortsetzen, nachdem die DOM-Manipulation abgeschlossen wurde
- 25. Was ist der Unterschied zwischen Beenden und Fortsetzen in Browser()?
- 26. PHP Abfangen eines SimpleXMLElement Parse-Fehlers
- 27. Kann bestimmte Ausnahme mit ExecutorService und Callables nicht abfangen?
- 28. Ausführung wird ohne jede Ausnahme
- 29. Reraise (gleiche Ausnahme) nach dem Abfangen einer Ausnahme in Ruby
- 30. Atom.io suchen und löschen, ist das möglich?
Gah! Beat mich um 21 Sekunden. –
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
fangen, also wie loggen Sie es ein und fahren Sie fort? – numerical25