49 Stimmen

Warum wird der finally-Block nach dem Aufruf von sys.exit(0) im except-Block ausgeführt?

Ich bin neu in Python. Ich möchte nur wissen, warum die finally Block ausgeführt wird, nachdem er sys.exit(0) im except blockieren?

Code :

import sys

def divide_by_zero():
    try:
        10/0
        print "It will never print"
    except Exception:
        sys.exit(0)
        print "Printing after exit"
    finally:
        print "Finally will always print"

divide_by_zero() 

Übrigens habe ich gerade versucht, das Gleiche wie in Java zu tun, wo die finally Block ist pas ausgeführt, wenn System.exit(0) ist in der catch Block.

1 Stimmen

Der "sanfte Ausstieg" ist eigentlich ein sehr praktisches Verhalten. Sie können tun sys.exit(1) wenn eine Ausnahme behandelt wird, und dennoch in der Lage sein, einige wichtige abschließende Aufräumarbeiten wie das Schließen von Verbindungen, Dateien usw. durchzuführen.

98voto

NPE Punkte 462670

Alle sys.exit() löst eine Ausnahme des Typs SystemExit .

からの Dokumentation :

Beenden von Python. Dies wird implementiert, indem die SystemExit Ausnahme, so dass Bereinigungsaktionen, die durch finally Klauseln von try Anweisungen werden beachtet, und es ist möglich, den Ausgang abzufangen Versuch auf einer äußeren Ebene abzufangen.

Wenn Sie das Folgende ausführen, können Sie sich selbst davon überzeugen:

import sys
try:
  sys.exit(0)
except SystemExit as ex:
  print 'caught SystemExit:', ex

Als Alternative, os._exit(n) mit dem Statuscode stoppt den Prozess und umgeht einen Großteil der Aufräumarbeiten, einschließlich finally Blöcke usw.

11voto

NilColor Punkte 3392

Sie sollten Folgendes verwenden os._exit(0) .

Zu Ihrem Beispiel:

Eine finally-Klausel wird immer ausgeführt, bevor die try-Anweisung verlassen wird, ob eine Ausnahme aufgetreten ist oder nicht.

Dies ist von Fehler und Ausnahmen Teil der Python-Dokumente. Also - Ihr finally-Block wird in dem von Ihnen gezeigten Beispiel immer ausgeführt, es sei denn, Sie verwenden os._exit(0) . Aber Sie sollten es mit Bedacht einsetzen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X