<?php
function some_function($arg) {
if($filter->check_for_safe_input($arg)) {
throw new Exception("Hacking Attempt");
}
do_some_database_stuff($arg);
}
?>
Im obigen Codebeispiel tut es do_some_database_stuff jemals angerufen werden, wenn check_for_safe_input schlägt fehl, oder stoppt die Ausnahme die Ausführung der Funktion? Das ist etwas, dessen ich mir nie ganz sicher war, und normalerweise stecke ich einfach Funktionen wie do_some_database_stuff in einer else-Anweisung, um sicher zu sein, aber dies führt tendenziell zu stark verschachtelten Funktionen.
Darin Dimitrow
Ja, nicht abgefangene Ausnahmen führen zu schwerwiegenden Fehlern, die die Ausführung des Skripts stoppen. Also die do_some_database_stuff Die Funktion wird nicht aufgerufen, wenn eine Ausnahme ausgelöst wird. Mehr über Ausnahmen erfahren Sie in Dieser Artikel.
Was ist, wenn es in der Funktion gefangen ist, die diese aufruft? Wird der Rest dieser Funktion dann jemals ausgeführt?
– Nicht Joe Bloggs
20. Februar 2010 um 12:28 Uhr
Nein, sobald Sie eine Ausnahme auslösen, wird die Funktionsausführung gestoppt (als ob Sie ein Ergebnis zurückgegeben hätten) und die Ausnahme sprudelt durch den Aufrufstapel, bis sie eine findet catch Aussage.
– Darin Dimitrow
20. Februar 2010 um 12:30 Uhr
Nein, die Ausführung wird in der Fangfunktion fortgesetzt; Sie können (in PHP) die Ausführung nicht dort fortsetzen, wo eine Ausnahme sie gestoppt hat.
– Bobin
20. Februar 2010 um 12:31 Uhr
@bobince, eigentlich scheint es so besser zu sein. Warum möchte ich, dass die Ausführung fortgesetzt wird, nachdem eine Ausnahme ausgelöst wurde?
– Aditya MP
5. Oktober 2011 um 6:18 Uhr
@aditya: Das ist in der Tat die allgemein gewünschte Art und Weise, wie Ausnahmen in allen Sprachen funktionieren. Eine fortsetzbare Ausnahme wäre jedoch ein interessantes Sprachfeature. Sie könnten es für Warnungen verwenden, bei denen ein Aufrufer auf dem Stack entscheiden könnte, ob eine Warnungsausnahme schwerwiegend oder ignorierbar ist, oder als Co-Routine-ähnliches Konstrukt.
– Bobin
5. Oktober 2011 um 12:03 Uhr
Svens
Sehen Sie sich das PHP-Handbuch zu Ausnahmen an.
Wenn eine Ausnahme ausgelöst wird, wird der Code nach der Anweisung nicht ausgeführt und PHP versucht, den ersten passenden Catch-Block zu finden. Wenn eine Ausnahme nicht abgefangen wird, wird ein PHP Fatal Error mit einer „Uncaught Exception …“-Meldung ausgegeben, es sei denn, es wurde ein Handler mit set_exception_handler() definiert.
Also ja, der Rest der Funktion wird nicht ausgeführt, stattdessen tritt ein schwerwiegender Fehler auf.
Wenn Sie die Ausnahme abfangen, wird die Ausführung des Skripts im entsprechenden Catch-Block fortgesetzt, alles “zwischen” der Funktion, die eine Ausnahme auslöst, und dem Catch-Block wird nicht ausgeführt.
Eine Ausnahme, wenn sie nicht abgefangen wird, beendet die Skriptausführung.