Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 341 – Vereinheitlichung von try-except und try-finally

Autor:
Georg Brandl <georg at python.org>
Status:
Final
Typ:
Standards Track
Erstellt:
04-Mai-2005
Python-Version:
2.5
Post-History:


Inhaltsverzeichnis

Zusammenfassung

Dieses PEP schlägt eine Änderung der Syntax und Semantik von try-Anweisungen vor, um kombinierte try-except-finally-Blöcke zu ermöglichen. Das bedeutet kurz gesagt, dass es gültig wäre zu schreiben

try:
    <do something>
except Exception:
    <handle the error>
finally:
    <cleanup>

Rationale/Vorschlag

Es gibt viele Anwendungsfälle für die try-except-Anweisung und die try-finally-Anweisung per se; jedoch muss man oft Ausnahmen abfangen und danach einige Bereinigungsarbeiten ausführen. Es ist etwas ärgerlich und nicht sehr verständlich, dass man schreiben muss

f = None
try:
    try:
        f = open(filename)
        text = f.read()
    except IOError:
        print 'An error occurred'
finally:
    if f:
        f.close()

Daher wird vorgeschlagen, dass eine Konstruktion wie diese

try:
    <suite 1>
except Ex1:
    <suite 2>
<more except: clauses>
else:
    <suite 3>
finally:
    <suite 4>

genau dasselbe ist wie die Legacy

try:
    try:
        <suite 1>
    except Ex1:
        <suite 2>
    <more except: clauses>
    else:
        <suite 3>
finally:
    <suite 4>

Dies ist abwärtskompatibel, und jede heute legale try-Anweisung würde weiterhin funktionieren.

Änderungen an der Grammatik

Die Grammatik für die try-Anweisung, die derzeit

try_stmt: ('try' ':' suite (except_clause ':' suite)+
        ['else' ':' suite] | 'try' ':' suite 'finally' ':' suite)

müsste werden

try_stmt: 'try' ':' suite
        (
            (except_clause ':' suite)+
            ['else' ':' suite]
            ['finally' ':' suite]
        |
            'finally' ':' suite
        )

Implementierung

Da der PEP-Autor derzeit nicht über ausreichende Kenntnisse der CPython-Implementierung verfügt, kann er leider keine liefern. Thomas Lee hat einen Patch eingereicht [2].

Laut Guido sollte dies jedoch ein Kinderspiel sein, es zu implementieren [1] – zumindest für einen Core-Hacker.

Dieser Patch wurde am 17. Dezember 2005, SVN-Revision 41740, committet [3].

Referenzen


Quelle: https://github.com/python/peps/blob/main/peps/pep-0341.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT