sys.exit ()
und exit
lösen eine eingebaute Ausnahme SystemExit
aus.
Daher verhält es sich als Teil von "try-catch" und tritt auch "finally" ein.SystemExit
erbt BaseException
, damit es nicht fälschlicherweise von catch
als normale Ausnahme oder Fehler abgefangen wird. (Sie können auch bewusst "fangen".)
Mit anderen Worten kann davon ausgegangen werden, dass der Abschaltvorgang an dem Ort ausgeführt wird, an dem der übergeordnete "SystemExit" empfangen wird.exit ()
ist ein Shutdown-Prozess, daher werden Destruktoren und Shutdown-Funktionen ausgeführt, aber finally
als Ausnahmemechanismus wird nicht übergeben.Der Unterschied besteht darin, ob "exit" als Ausnahme behandelt werden soll oder nicht.
PHP
Sie finden es in den Erläuterungen und Benutzerhinweisen zu exit
.
Beispiel 3 Ein Beispiel für die Ausführung einer Shutdown-Funktion oder eines Destruktors
>
<?php
class Foo
{
public function __destruct()
{
echo 'Destruct: ' . __METHOD__ . '()' . PHP_EOL;
}
}
>
function shutdown()
{
echo 'Shutdown: ' . __FUNCTION__ . '()' . PHP_EOL;
}
>
$foo = new Foo();
register_shutdown_function('shutdown');
>
exit();
echo 'Dies wird nicht ausgegeben.';
?>
Die Ausgabe des obigen Beispiels ist wie folgt.
Shutdown: shutdown()
Destruct: Foo::__destruct()
PHP: exit - Manual : User Contributed Notes
A side-note for the use of exit with finally: if you exit somewhere in a try block, the finally won't be executed. Could not sound obvious: for instance in Java you never issue an exit, at least a return in your controller; in PHP instead you could find yourself exiting from a controller method (e.g. in case you issue a redirect).
Here follows the POC:
<?php
echo "testing finally wit exit\n";
>
try {
echo "In try, exiting\n";
>
exit;
} catch(Exception $e) {
echo "catched\n";
} finally {
echo "in finally\n";
}
>
echo "In the end\n";
?>
This will print:
testing finally wit exit In try, exiting
Es gibt auch eine Möglichkeit, eine Ausnahme auszulösen, anstatt den Beendigungsprozess mit catch zu beenden und zu schreiben, aber es scheint, dass dies keine perfekte Alternative ist.
Natürlich habe ich versucht, es auf PHP7 auszuführen, aber das Ergebnis war das gleiche.
Python
Uchan Hinweis: Unterschiede zwischen Python exit (), sys.exit (), os._exit () Es ist ein Blick, wenn Sie es betrachten.
Mit Ausnahme von "os._exit ()" werden Ausnahmen ausgelöst, sodass "finally" ebenfalls relevant ist. Wenn gesagt wird, dass "os._exit ()" dem "exit ()" von PHP entspricht, sieht es etwas anders aus.
exit
4. Integrierte Konstanten - Python 2.7.x-Dokumentation
Ein Objekt, das eine Meldung wie "Verwenden Sie quit () oder Strg-D (dh EOF) zum Beenden" druckt, wenn es angezeigt wird, und beim Aufrufen einen "SystemExit" mit dem angegebenen Exit-Code sendet. ..
sys.exit()
[28.1.sys - Systemparameter und -funktionen - Python 2.7.x-Dokumentation]
Beenden Sie
Python
. Daexit ()
SystemExitsendet, ist es möglich, die Endverarbeitung in der
finally-Klausel der
try-Anweisung zu beschreiben oder eine Ausnahme auf einer höheren Ebene abzufangen und die
exit`-Verarbeitung zu unterbrechen. Ich kann es schaffen (Weggelassen) Letztendlich löst "exit ()" "nur" eine Ausnahme aus. Wenn es also vom Hauptthread aufgerufen wird, wird der Prozess nur beendet und die Ausnahme nicht blockiert.
6. Integrierte Ausnahmen - Python 2.7.x-Dokumentation
Diese Ausnahme wird von der Funktion sys.exit () ausgelöst. Wenn diese Ausnahme nicht behandelt wird, wird der Python-Interpreter beendet, ohne dass ein Stack-Traceback angezeigt wird. Wenn der zugehörige Wert eine reguläre Ganzzahl ist, stellt er den Exit-Status dar (an die Funktion exit () übergeben). Wenn der Wert None ist, ist der Exit-Status 0. Bei anderen Typen (z. B. Zeichenfolgen) wird der Wert dieses Objekts angezeigt und der Beendigungsstatus ist 1.
Die Instanz dieser Ausnahme hat den Attributcode. Dieser Wert wird auf den Exit-Status oder die Fehlermeldung gesetzt (standardmäßig Keine). Außerdem ist diese Ausnahme nicht unbedingt ein Fehler, sodass sie von BaseException anstelle von StandardError abgeleitet wird.
sys.exit () stellt sicher, dass die Bereinigungsverarbeitung (die finally-Klausel der try-Anweisung) ausgeführt wird und dass das Skript ausgeführt werden kann, ohne dass das Risiko besteht, dass der Debugger außer Kontrolle gerät. In Ausnahmen übersetzt. Sie können die Funktion os._exit () verwenden, wenn dringend eine sofortige Beendigung erforderlich ist (z. B. in einem untergeordneten Prozess nach dem Aufruf von fork ()).
Diese Ausnahme erbt von BaseException und nicht von StandardError oder Exception, damit der Code, der die Exception abfängt, sie nicht versehentlich abfängt. Dadurch wird diese Ausnahme stetig an den Anrufer weitergegeben und der Interpreter beendet.
In Version 2.5 geändert: Geändert, um BaseException zu erben.
Genau! nicht wahr.
os._exit()
15.1. Os - Verschiedene Betriebssystemschnittstellen - Python 2.7.x-Dokumentation
Beenden Sie den Vorgang mit dem Beendigungsstatus n. Zu diesem Zeitpunkt wird der Bereinigungshandler nicht aufgerufen und der Standardeingabe- / Ausgabepuffer wird nicht geleert.
Aus dem gleichen Blog.
Es ist ein Übergang von der Ära ohne "endlich" zur Ära nach der Implementierung. In Kombination mit der Operation "Exit" dieses Mal habe ich das Gefühl, dass der Destruktor wieder erkannt wurde.
Recommended Posts