Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen

Ausnahmebehandlung

Heute werde ich über ** Fehler ** erklären. Es ist ein rudimentärer Inhalt, aber es ist in Ordnung, einen Fehler try ~ außer zu schreiben, oder? Wenn ja, beziehen Sie sich bitte darauf. Auch wenn es einen Fehler in der Erklärung gibt, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.

Übrigens werden die in Python auftretenden Fehler grob in zwei Typen unterteilt. Syntaxfehler </ font> und Ausnahme </ font>.

Syntax-Fehler

Dies geschieht, wenn Sie feststellen können, dass Sie falsch liegen, bevor Sie das Programm ausführen. Ein Fehler, der auftritt, wenn Sie einen Variablennamen verwenden, der nicht den Bezeichnerregeln entspricht, der Einzug falsch ist oder die Syntax ohnehin falsch ist. Schreiben Sie "a [0]" als "a [0}", schreiben Sie "if" als "von" ... (Haben Sie das getan? Ich habe ...) Ich kann Ihnen kein Beispiel geben. Hmm. Einfach ausgedrückt sind Syntaxfehler grammatikalische Fehler, die mit dem Schreiben von Programmen abnehmen. Ich werde vorerst ein Beispiel schreiben lol

#Beispiele für Syntaxfehler
a = [1, 2, 3]
print(a[3})

Ausgabe

    print(a[3})
             ^
SyntaxError: invalid syntax

Ausnahme

Dies ist ein Fehler, der auftritt, wenn der Computer (Interpreter?) Beim Ausführen des Programms feststellt, dass dies nicht möglich ist. In einem einfachen Beispiel


a = [1, 2, 3]
print(a[3])

Ausgabe

      1 a = [1, 2, 3]
----> 2 print(a[3])

IndexError: list index out of range

Da die Elemente des Arrays nur bis zur Indexnummer 2 existieren, tritt natürlich eine Ausnahme auf, wenn versucht wird, "a [3]" auszugeben. Ich habe hier "IndexError" als Beispiel für eine Ausnahme gezeigt, aber es gibt noch viele weitere.

Fangen Sie die Ausnahme

Wenn Sie jetzt ein Programm ausführen, möchten Sie möglicherweise die Verarbeitung fortsetzen, auch wenn eine Ausnahme auftritt. Verwenden Sie in diesem Fall das bekannte "try ~ Except". Verhindern wir, dass das Programm gestoppt wird, auch wenn "ZeroDivisionError" aufgrund der Ausnahmebehandlung angezeigt wird.


a = 1
b = 0

try:
    print(a/b)
except ZeroDivisionError:
    print('Du kannst es nicht durch 0 teilen, oder? Ich habe einen ZeroDivisionError')
finally:
    print('Teilen ist schwierig')

Ausgabe

Du kannst es nicht durch 0 teilen, oder? Ich habe einen ZeroDivisionError
Teilen ist schwierig

Sie können nach der letzten Bereinigung "endlich" hinzufügen, wie im obigen Beispiel. Dies wird zuletzt ausgeführt, unabhängig davon, ob eine Ausnahme auftritt oder nicht, bei der die Verarbeitung unterbrochen und beendet wird.

Mehrere Ausnahmen abfangen

"Ausnahme" kann so angegeben werden, dass der Taple mehrere Ausnahmen wie folgt abfangen kann:


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError):
    print('Ich erhalte einen Wertefehler oder einen Nullteilungsfehler')

Ausgabe 1

a = 1.5
Ich erhalte einen Wertefehler oder einen Nullteilungsfehler

Ausgabe 2

a = 1
b = 0
Ich erhalte einen Wertefehler oder einen Nullteilungsfehler

Nennen Sie die Ausnahme

Darüber hinaus können Sie die auftretende Ausnahme benennen. Im Folgenden tippe ich, um einen "ValueError" oder "ZeroDivisionError" auszulösen, aber ich fange die aufgetretene Ausnahme ab und nenne sie "ER".


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError) as ER:
    print(f'{type(ER)}Es passiert')

Ausgabe 1

a = 1.5
<class 'ValueError'>Es passiert

Ausgabe 2

a = 1
b = 0
<class 'ZeroDivisionError'>Es passiert

Bitte beachten Sie, dass der Name "ER" nur in der "außer" Suite verwendet werden kann. Wenn Sie Folgendes tun, wird "NameError" auftreten (da es eine große Sache ist, lassen Sie uns auch diesen "NameError" abfangen).


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError) as ER:
    pass

try:
    print(ER)
except NameError:
    print('Was ist Notaufnahme?')

Ausgabe

a = 1.5
Was ist Notaufnahme?

Eine Ausnahme mit Raise auslösen

Sie können auch absichtlich eine Ausnahme mit "erhöhen" auslösen. Sie können hier jedoch nur Unterklassen oder Instanzen der BaseException-Klasse verwenden. (Wie wir später sehen werden, sind die meisten häufigen Ausnahmen Unterklassen dieser BaseException.)


def ErFunc(b: int) -> None:
    if b == 0:
        raise ZeroDivisionError        
b = 0
try:
    ErFunc(b)
except BaseException as ER:
    print(f'{type(ER)}Tritt auf')

Ausgabe

<class 'ZeroDivisionError'>Tritt auf

Da hier die BaseException-Klasse angegeben ist, kann jede abgeleitete Klasse abgefangen werden. Hier wird der ZeroDivisionError abgefangen.

Benutzerdefinierte Ausnahme

Schließlich können Sie auch Klassen verwenden, um benutzerdefinierte Ausnahmeklassen zu erstellen. Das folgende Programm ermittelt die Summe zweier einstelliger natürlicher Zahlen, löst jedoch eine Ausnahme aus, wenn eine negative Zahl oder eine zweistellige Zahl eingegeben wird oder wenn die Summe zweistellig wird. Sowohl die Klasse "ParameterRangeException" als auch die Klasse "ReturnRangeException" sind bereichsbezogene Klassen, daher erben sie von der Klasse "RangeException". Natürlich ist es in Ordnung, von der integrierten Standardklasse "Exception" zu erben.


class RangeException(Exception):
    pass

class ParameterRangeException(RangeException):
    pass

class ReturnRangeException(RangeException):
    pass

def add(a: int, b: int) -> int:

    if not 0 < a < 10:
        raise ParameterRangeException
    
    if not 0 < b < 10:
        raise ParameterRangeException
        
    if a + b > 10:
        raise ReturnRangeException
    else:
        return a + b

try:
    a = int(input())
    b = int(input())
    print(f'Die Summe der beiden Zahlen{add(a, b)}Deshi')
except ParameterRangeException as PRE:
    print(f'{type(PRE)}Tritt auf. Formales Argument ist 1~Es muss 9 sein')
except ReturnRangeException as RRE:
    print(f'{type(RRE)}Tritt auf. Ich muss den Rückgabewert 9 oder weniger machen')
finally:
    print('Das ist alles für die Ausnahme')

Ausgabe 1

1
8
Die Summe der beiden Zahlen ist 9
Das ist alles für die Ausnahme

Ausgabe 2

2
11
<class '__main__.ParameterRangeException'>Tritt auf. Formales Argument ist 1~Es muss 9 sein
Das ist alles für die Ausnahme

Ausgabe 3

5
7
<class '__main__.ReturnRangeException'>Tritt auf. Ich muss den Rückgabewert 9 oder weniger machen
Das ist alles für die Ausnahme

Ergänzung

  • Die übergeordnete Klasse für integrierte Standardausnahmen, die von Python bereitgestellt werden, ist die BaseException-Klasse. Mit diesem übergeordneten Element gibt es eine "Exception" -Klasse, und die "ValueError" -Klasse und die "IndexError" -Klasse existieren in Form der Vererbung dieser Klasse.

  • Wenn Sie eine benutzerdefinierte Ausnahme erstellen, setzen Sie "BaseException" nicht in das Argument "UserExceptionClass ()". Die BaseException-Klasse scheint nicht davon auszugehen, dass sie von benutzerdefinierten Ausnahmen geerbt wird.

  • Es gibt eine "ArithmeticError" -Klasse als untergeordnete Klasse der "BaseException" -Klasse, aber unter dieser Klasse befinden sich die Klassen "OverflowError" und "ZeroDivisionError". Wenn Sie arithmetische Fehler behandeln möchten, können Sie beim Erstellen einer benutzerdefinierten Ausnahme "ArithmeticError" in das Argument einfügen (jede Klasse unter der Klasse "Exception" ist in Ordnung).

Recommended Posts