Ausnahmebehandlung und benutzerdefinierte Ausnahmetypen in Python

Ausnahmen sowie Handhabung und Verwendung in Python

abnormal

Während der Ausführung des Programms treten zwangsläufig einige Fehler auf, wie zum Beispiel:
Verwendung einer Variablen, der kein Wert zugewiesen wurde,
Verwendung eines nicht vorhandenen Index,
Division durch 0
...
Wir nennen diese Fehler im Programm Ausnahmen.
Sobald während der Ausführung des Programms eine Ausnahme auftritt, wird das Programm sofort beendet und alle Codes nach der Ausnahme werden nicht ausgeführt!

Behandeln Sie Ausnahmen

Wenn während der Ausführung des Programms eine Ausnahme auftritt, besteht der Zweck nicht darin, unser Programm direkt zu beenden!
Python hofft, dass wir beim Auftreten einer Ausnahme Code schreiben können, um die Ausnahme zu behandeln!

try-Anweisung

try:
    代码块(可能出现错误的语句)
except 异常类型 as 异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后的处理方式)
else:
    代码块(没出错时要执行的语句)    
finally:
    代码块(该代码块总会执行)

„Try“ ist ein Muss. Es spielt keine Rolle, ob die else-Anweisung vorhanden ist oder nicht.
Es muss mindestens eine „exclusive“ und „final“-Anweisung vorhanden sein.

Sie können den Code, der möglicherweise schief geht, in eine Try-Anweisung einfügen, sodass er normal ausgeführt wird, wenn der Code keine Fehler aufweist. Wenn
ein Fehler auftritt, wird der Code in der Expect-Klausel ausgeführt, sodass wir Ausnahmen behandeln können durch Code
, um eine Ausnahme zu vermeiden. Bewirkt, dass das gesamte Programm beendet wird

Weitergabe von Ausnahmen (Auslösen von Ausnahmen)

Wenn in einer Funktion eine Ausnahme auftritt und die Ausnahme in der Funktion behandelt wird, wird die Ausnahme nicht weiter verbreitet.
Wenn die Ausnahme in der Funktion nicht behandelt wird, wird die Ausnahme weiterhin an den Funktionsaufruf weitergegeben.
Wenn der Funktionsaufruf handles Wenn eine Ausnahme empfangen wird, wird sie nicht mehr weitergegeben. Wenn sie nicht behandelt wird, wird sie weiterhin an den aufrufenden Ort weitergegeben,
bis sie an den globalen Bereich (Hauptmodul) übergeben wird. Wenn sie immer noch nicht behandelt wird, Das Programm wird beendet und die Ausnahmeinformationen werden angezeigt.

Wenn während der Ausführung des Programms eine Ausnahme auftritt, werden alle Ausnahmeinformationen in einem speziellen Ausnahmeobjekt gespeichert.
Wenn die Ausnahme weitergegeben wird, wird das Ausnahmeobjekt tatsächlich an die aufrufende Site geworfen.
Beispiel: Das Objekt der ZeroDivisionError-Klasse ist Wird speziell zur Darstellung der Division durch 0 verwendet. Das Ausnahmeobjekt
der NameError-Klasse wird speziell zur Behandlung variabler Fehlerausnahmen
usw. verwendet.

Wenn das Programm ausgeführt wird und keine Ausnahmebehandlung durchgeführt wird, breitet sich die Ausnahme weiter aus, bis sie an den globalen Bereich (Hauptmodul) übergeben wird. Zu diesem Zeitpunkt wird das Programm beendet und zeigt die Ausnahmeinformationen an.

Hier ist ein Beispiel:

def fn():
    raise ValueError("这是一个自定义的异常")

def main():
    try:
        fn()
    except ValueError as e:
        print("发生了异常:", e)

main()

print("程序结束")

Im obigen Code fn()verwendet die Funktion raiseeine Anweisung, um eine Ausnahme auszulösen ValueError, und die Ausnahmeinformationen werden als „Dies ist eine benutzerdefinierte Ausnahme“ angegeben. Verwenden Sie in main()der Funktion try-exceptdie Anweisung, um ValueErrordie Ausnahme abzufangen und die Ausnahmeinformationen auszugeben. Geben Sie abschließend „Programmende“ aus.

eine Ausnahme auslösen

Sie können die Raise-Anweisung verwenden, um eine Ausnahme auszulösen.
Der Raise-Anweisung muss eine Ausnahmeklasse oder eine Instanz der Ausnahme folgen.

Wenn wir die Ausnahmebehandlung im Code verwenden, können wir raiseAnweisungen verwenden, um benutzerdefinierte Ausnahmen auszulösen oder abgefangene Ausnahmen erneut auszulösen.

Hier ist ein Beispiel:

def divide(x, y):
    try:
        if y == 0:
            raise ZeroDivisionError("除数不能为零")
        result = x / y
    except ZeroDivisionError as e:
        print(e)
        raise  # 重新引发已捕获的异常
    else:
        print("结果:", result)

try:
    divide(10, 2)
    divide(10, 0)
except ZeroDivisionError as e:
    print("捕获异常:", e)

Wenn im obigen Code der Divisor Null ist, raiselösen wir die integrierte ZeroDivisionErrorAusnahme durch die Anweisung aus und übergeben die Fehlermeldung. except ZeroDivisionErrorVerwenden Sie gleichzeitig raiseAnweisungen im Block, um die abgefangene Ausnahme erneut auszulösen und die Ausnahme weiterhin extern zu verarbeiten.

Wenn wir eine Ausnahme auslösen verwenden, können wir wählen, ob wir eine Instanz der Ausnahmeklasse übergeben oder den Klassennamen verwenden möchten, um die Ausnahme direkt auszulösen. In diesem Fall haben wir Letzteres verwendet, nämlich raise ZeroDivisionError("除数不能为零").

Im Hauptcodeblock try-exceptverwenden wir es, um ZeroDivisionErrorAusnahmen abzufangen und die Informationen zu den abgefangenen Ausnahmen auszudrucken. divide()Auf diese Weise können Sie von Funktionen ausgelöste Ausnahmen behandeln .

Die Ausgabe ist wie folgt:

结果: 5.0
division by zero
捕获异常: division by zero

Durch die Verwendung raisevon Anweisungen können wir in unserem Code explizit Ausnahmen auslösen und diese nach Bedarf behandeln oder weitergeben. Dies macht die Ausnahmebehandlung flexibler und kontrollierbarer und trägt dazu bei, robusten Code zu schreiben.

try-exclusive-Anweisung

In Python können wir try-exceptAnweisungen verwenden, um Ausnahmen bestimmter Typen abzufangen und zu behandeln. Zusätzlich zum Abfangen bestimmter Ausnahmetypen können wir auch try-exceptmehrere exceptAnweisungsblöcke verwenden, um verschiedene Ausnahmetypen separat zu behandeln.

Hier ist ein Beispiel:

def divide(x, y):
    try:
        result = x / y
        print("结果:", result)
    except ZeroDivisionError:
        print("除数不能为零")
    except TypeError:
        print("类型错误:无法进行除法运算")
    except ValueError:
        print("数值错误")
    
divide(10, 2)
divide(10, 0)
divide(10, "2")

Im obigen Code divide()wird die Funktion verwendet, um die Division zweier Zahlen zu berechnen und das Ergebnis auszugeben. Die Divisionsoperation wird in tryeinem Block ausgeführt und wenn eine Ausnahme auftritt, exceptwird der entsprechende Block basierend auf dem Ausnahmetyp ausgeführt.

Beim ersten Aufruf divide(10, 2)wird keine Ausnahme ausgelöst und das Ergebnis ausgegeben, da der Divisor nicht Null ist.

Beim zweiten Aufruf divide(10, 0)ist der Divisor Null und es wird eine Ausnahme ausgelöst ZeroDivisionError. Das Programm führt den entsprechenden except ZeroDivisionErrorBlock aus und gibt „Der Divisor darf nicht Null sein“ aus.

Beim dritten Aufruf divide(10, "2")ist der Divisor vom Typ String und die Division kann nicht durchgeführt werden. Es wird eine Ausnahme ausgelöst TypeError. Das Programm führt den entsprechenden except TypeErrorBlock aus und gibt „Typfehler: Division kann nicht durchgeführt werden“ aus.

Die Ausgabe ist wie folgt:

结果: 5.0
除数不能为零
类型错误:无法进行除法运算

Durch die Verwendung mehrerer exceptBlöcke können Sie spezifischen Behandlungscode für verschiedene Ausnahmetypen schreiben, sodass Ihr Programm eine Vielzahl möglicher Ausnahmen genauer behandeln kann. Dies verbessert die Robustheit und Zuverlässigkeit des Programms.

endlich Aussage

Neben der Verwendung von try-exceptAnweisungen zur Behandlung von Ausnahmen können Sie auch finallyKlauseln verwenden, um Codeblöcke zu definieren, die unabhängig davon ausgeführt werden müssen, ob eine Ausnahme auftritt. finallyDer Codeblock in der Klausel wird tryausgeführt, nachdem der Code im Block ausgeführt wurde, unabhängig davon, ob eine Ausnahme auftritt.

Hier ist ein Beispiel:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为零")
    finally:
        print("执行finally代码块")
    
divide(10, 2)
divide(10, 0)

Im obigen Code divide()wird die Funktion verwendet, um die Division zweier Zahlen zu berechnen und das Ergebnis auszugeben, wobei try-except-finallyAnweisungen zur Behandlung von Ausnahmen verwendet werden.

Da der Divisor beim ersten Aufruf divide(10, 2)ungleich Null ist, wird keine Ausnahme ausgelöst, sodass das Ergebnis gedruckt und finallyder Codeblock ausgeführt wird. Die Ausgabe ist wie folgt:

结果: 5.0
执行finally代码块

Beim zweiten Aufruf ist der Teiler Null, es wird eine Ausnahme divide(10, 0)ausgelöst , die Ausnahme wird abgefangen und eine Fehlermeldung ausgegeben und die Ausführung des Codeblocks wird fortgesetzt. Die Ausgabe ist wie folgt:ZeroDivisionErrorfinally

除数不能为零
执行finally代码块

finallyWie Sie sehen, wird der Code im Codeblock unabhängig davon ausgeführt, ob eine Ausnahme auftritt .

finallyKlauseln werden normalerweise zum Freigeben von Ressourcen verwendet, z. B. zum Schließen von Dateien, zum Freigeben von Sperren usw. Es stellt sicher, dass unabhängig davon, ob eine Ausnahme auftritt, einige notwendige Reinigungsvorgänge durchgeführt werden, um die Stabilität und Sicherheit des Programms zu gewährleisten.

else-Anweisung

Zusätzlich zu try-exceptAnweisungen können Sie auch elseKlauseln verwenden, um tryeinen Codeblock zu definieren, der ausgeführt wird, wenn innerhalb des Blocks keine Ausnahme auftritt.

Hier ist ein Beispiel:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为零")
    else:
        print("结果:", result)
    
divide(10, 2)
divide(10, 0)

Im obigen Code divide()wird die Funktion verwendet, um die Division zweier Zahlen zu berechnen und das Ergebnis auszugeben. Führen Sie Divisionsoperationen in tryeinem Block durch. Wenn eine Division durch Null-Ausnahme auftritt, führt das Programm den entsprechenden except ZeroDivisionErrorBlock aus und gibt „Der Divisor darf nicht Null sein“ aus. Wenn keine Ausnahme auftritt, führt das Programm elseden Codeblock in der Klausel aus und gibt das Ergebnis aus.

Beim ersten Aufruf divide(10, 2)wird keine Ausnahme ausgelöst und das Ergebnis ausgegeben, da der Divisor nicht Null ist.

Beim zweiten Aufruf divide(10, 0)ist der Divisor Null und es wird eine Ausnahme ausgelöst ZeroDivisionError. Das Programm führt den entsprechenden except ZeroDivisionErrorBlock aus und gibt „Der Divisor darf nicht Null sein“ aus, ohne elseden Codeblock in der Klausel auszuführen.

Die Ausgabe ist wie folgt:

结果: 5.0
除数不能为零

Durch die Verwendung elsevon Klauseln können Sie die normale Verarbeitungslogik elsedarin platzieren und so Ihren Code klarer und prägnanter gestalten. Auf diese Weise können wir Ausnahmebehandlung und normale Logikverarbeitung klar unterscheiden und so die Lesbarkeit und Wartbarkeit des Codes verbessern.

Benutzerdefinierter Ausnahmetyp

Wenn wir außerdem den Ausnahmetyp anpassen müssen, können wir Exceptiondurch Erben der integrierten Klasse einen neuen Ausnahmetyp erstellen und diesen Typ verwenden, wenn eine Ausnahme ausgelöst werden muss.

Hier ist ein Beispiel:

class MyError(Exception):
    def __init__(self, msg):
        self.msg = msg

def divide(x, y):
    try:
        if y == 0:
            raise MyError("除数不能为零")
        result = x / y
    except MyError as e:
        print(e.msg)
    else:
        print("结果:", result)
    finally:
        print("执行清理操作")

divide(10, 2)
divide(10, 0)

Im obigen Code haben wir Exceptioneinen neuen Ausnahmetyp erstellt, indem wir die Klasse geerbt MyErrorund in ihrem Konstruktor eine Fehlermeldung übergeben haben. In divide()der Funktion lösen wir beim Teilen durch Null eine benutzerdefinierte Ausnahme aus MyErrorund fangen diese Ausnahme ab und behandeln sie. elseWenn keine Ausnahme auftritt, wird der Codeblock in der Klausel ausgeführt und das Ergebnis gedruckt. finallyUnabhängig davon, ob eine Ausnahme auftritt, wird der Codeblock in der Klausel schließlich ausgeführt und „Bereinigungsvorgang wird ausgeführt“ gedruckt.

Die Ausgabe ist wie folgt:

结果: 5.0
执行清理操作
除数不能为零
执行清理操作

Durch das Anpassen von Ausnahmetypen können wir unseren eigenen Code besser organisieren und verwalten und so die Lesbarkeit und Wartbarkeit des Codes verbessern. Gleichzeitig kann es flexibler mit verschiedenen Arten von Ausnahmesituationen umgehen, um unterschiedlichen Geschäftsanforderungen gerecht zu werden.

Zusammenfassen

Dieser Artikel stellt die Verwendung und Behandlung von Ausnahmen in Python vor. Ausnahmen sind Fehler oder außergewöhnliche Bedingungen, die während der Programmausführung auftreten und mithilfe der try-exclusive-Anweisung abgefangen und behandelt werden können.

Der Artikel erklärt zunächst, was Ausnahmen sind und beschreibt die Bedeutung der Ausnahmebehandlung. Als Nächstes stellten wir vor, wie man mit der try-exclusive-Anweisung Ausnahmen abfängt und behandelt. Der Code im Try-Block kann eine Ausnahme auslösen, während der Code im Except-Block nur dann ausgeführt wird, wenn die entsprechende Ausnahme auftritt.

In dem Artikel wurde auch die „final“-Anweisung erwähnt, mit der wir einen Codeblock definieren können, der unabhängig davon ausgeführt wird, ob eine Ausnahme auftritt. Dies ist nützlich, um sicherzustellen, dass Ressourcen freigegeben oder bereinigt werden.

Darüber hinaus wird in dem Artikel auch die else-Anweisung vorgestellt, mit der der Code angegeben werden kann, der ausgeführt werden soll, wenn im try-Block keine Ausnahme ausgelöst wird. Auf diese Weise können wir je nachdem, ob eine Ausnahme auftritt, unterschiedliche Maßnahmen ergreifen.

Abschließend wurde in dem Artikel auch die Bedeutung und Verwendung benutzerdefinierter Ausnahmetypen erwähnt. Durch die Definition unserer eigenen Ausnahmeklassen können wir bestimmte Ausnahmesituationen besser organisieren und behandeln, wodurch der Code lesbarer und wartbarer wird.

Durch die Einführung dieses Artikels können Leser lernen, wie man Ausnahmen in Python behandelt und wie man den Ausnahmemechanismus verwendet, um robusteren Code zu schreiben. Gleichzeitig hilft die Vertrautheit mit den zugehörigen Konzepten und der Syntax der Ausnahmebehandlung den Lesern, Fehlerbedingungen im Programm besser zu debuggen und zu behandeln.

Ich denke du magst

Origin blog.csdn.net/qq_41308872/article/details/132857725
Empfohlen
Rangfolge