563 Stimmen

Warum brauchen wir die "finally"-Klausel in Python?

Ich bin mir nicht sicher, warum wir finally en try...except...finally Erklärungen. Meiner Meinung nach ist dieser Codeblock

try:
    run_code1()
except TypeError:
    run_code2()
other_code()

ist das Gleiche mit diesem hier, das finally :

try:
    run_code1()
except TypeError:
    run_code2()
finally:
    other_code()

Habe ich etwas verpasst?

0voto

s_mj Punkte 474

Ich habe versucht, einen Code auszuführen, bei dem ich Excel-Tabellen lesen wollte. Das Problem war, wenn es eine Datei gibt, die kein Blatt mit dem Namen "SheetSum" hat, bin ich nicht in der Lage, es an die Fehlerstelle zu verschieben!!! Der von mir geschriebene Code war:

def read_file(data_file):
    # data_file = '\rr\ex.xlsx'
    sheets = {}
    try:
        print("Reading file: "+data_file)
        sheets['df_1'] = pd.read_excel(open(data_file,'rb'), 'SheetSum')
    except Exception as excpt:
        print("Exception occurred", exc_info=True)
    return sheets

read_file(file)
shutil.move( file, dirpath +'\\processed_files')

Fehler geben :

[WinError 32] Der Prozess kann nicht auf die Datei zugreifen, weil sie gerade von einem anderen Prozess verwendet wird

Ich musste eine vollständige try except with finally blockieren und erzählen finally Ich muss die Datei in jedem Fall schließen:

def read_file(data_file):
    # data_file = '\rr\ex.xlsx'
    sheets = {}
    sheets_file = None
    try:
        print("Reading file: "+data_file)
        sheets_file = open(data_file,'rb')
        sheets['df_1'] = pd.read_excel(sheets_file, 'SheetSum')
    except Exception as excpt:
        print("Exception occurred", exc_info=True)
    finally:
        if sheets_file:
            sheets_file.close()
    return sheets

read_file(file)
shutil.move( file, dirpath +'\\processed_files')

Andernfalls bleibt die Datei weiterhin im Hintergrund geöffnet.

Si finally vorhanden ist, gibt sie eine Bereinigungshandling . Die try Klausel ausgeführt wird, einschließlich aller except y else Klauseln. Wenn eine Ausnahme in einer der Klauseln auftritt und nicht behandelt wird, wird die Ausnahme wird vorübergehend gespeichert . Die finally Klausel ausgeführt wird. Wenn eine gespeicherte Ausnahme auftritt, wird sie am Ende der finally Klausel. Wenn die finally Klausel eine weitere Ausnahme auslöst, wird die gespeicherte Ausnahme als Kontext für die neue Ausnahme festgelegt.

Mehr Aquí

0voto

i_want_more_edits Punkte 131

Nur um zu ermöglichen Abhijit Sahu's Kommentar zu diese Antwort viel besser und mit Syntaxhervorhebung zu sehen:

Auf diese Weise können Sie beobachten, was wann mit welchem Codeblock passiert:

try: 
    x = Hello + 20 
    x = 10 + 20 
except: 
    print 'I am in except block' 
    x = 20 + 30 
else: 
    print 'I am in else block' 
    x += 1 
finally: 
    print 'Finally x = %s' %(x)

0voto

Foad Najafi Punkte 1

Aquí können Sie sehen, wie try, except, else und finally zusammenarbeiten. Da Ihr Code jedoch keine 'sonst' dann ist das, was Sie behauptet haben, richtig. D.h., es gibt keine Unterschied zwischen den beiden Aussagen, die Sie geschrieben haben. Aber wenn 'sonst' irgendwo verwendet wird, dann 'endlich ' macht einen Unterschied

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