Python verwendet Ausnahmeobjekte, um abnormale Situationen darzustellen. Wenn ein Fehler auftritt, wird eine Ausnahme ausgelöst. Wenn das Ausnahmeobjekt nicht behandelt oder abgefangen wird, beendet das Programm die Ausführung mit einem sogenannten Traceback (einer Fehlermeldung):
>>> 1/0
Traceback ( letzter Aufruf zuletzt):
Datei „
1/0
ZeroDivisionError: Ganzzahldivision oder Modulo durch Null
Raise-Anweisung
Um eine Ausnahme auszulösen, kann die Raise-Anweisung mit einer Klasse (einer Unterklasse von Exception) oder einer Instanzparameternummer aufgerufen werden. Das folgende Beispiel verwendet die integrierte Ausnahmeklasse:
>>> raise Exception #引发一个没有任何错误信息的普通异常 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> raise Exception Exception >>> raise Exception('hyperdrive overload') # 添加了一些异常错误信息 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> raise Exception('hyperdrive overload') Exception: hyperdrive overload
Die integrierte Ausnahmeklasse, die mit dem System geliefert wird:
>>> Ausnahmen importieren
>>> dir(Exceptions)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', ' DeprecationWarning“, „EOFError“, „EnvironmentError“, „Exception“, „FloatingPointError“, „FutureWarning“, „GeneratorExit“, „IOError“, „ImportError“, „ImportWarning“, „IndentationError“, „IndexError“, „KeyError“ , 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', ' StopIteration“, „SyntaxError“, „SyntaxWarning“, „SystemError“, „SystemExit“, „TabError“, „TypeError“, „UnboundLocalError“, „UnicodeDecodeError“, „UnicodeEncodeError“, „UnicodeError“, „UnicodeTranslateError“, „UnicodeWarning“ , 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__doc__', '__name__', '__package__']
Wow! Es gibt viele häufig verwendete integrierte Ausnahmeklassen:
Benutzerdefinierte Ausnahme
Obwohl die integrierten Ausnahmeklassen die meisten Situationen abdecken und für viele Anforderungen ausreichen, müssen manchmal noch eigene Ausnahmeklassen erstellt werden Ausnahmeklasse.
Dasselbe wie bei anderen allgemeinen Klassen – stellen Sie nur sicher, dass Sie direkt oder indirekt von der Exception-Klasse erben. Wie folgt:
>>> class someCustomExcetion(Exception):pass
Natürlich können Sie dieser Klasse auch einige Methoden hinzufügen.
Ausnahmen abfangen
Wir können try/exclusive verwenden, um das Abfangen und Verarbeiten von Ausnahmen zu implementieren.
Angenommen, Sie erstellen ein Programm, das es dem Benutzer ermöglicht, zwei Zahlen einzugeben und diese dann zu dividieren:
x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y #运行并且输入 Enter the first number: 10 Enter the second number: 0 Traceback (most recent call last): File "I:/Python27/yichang", line 3, in <module> print x/y ZeroDivisionError: integer division or modulo by zero 为了捕捉异常并做出一些错误处理,可以这样写: try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except ZeroDivisionError: print "输入的数字不能为0!" #再来运行 >>> Enter the first number: 10 Enter the second number: 0
Die eingegebene Zahl kann nicht sein 0! #Wie wäre es damit? Diesmal ist es viel benutzerfreundlicher.
Es wäre besser, wenn wir beim Debuggen eine Ausnahme auslösen würden, wenn wir nicht möchten, dass der Benutzer die Ausnahmeinformationen während der Interaktion mit dem Benutzer sieht. Wie schalte ich den „Blockierungs“-Mechanismus ein/aus?
class MuffledCalulator: muffled = False #这里默认关闭屏蔽 def calc(self,expr): try: return eval(expr) except ZeroDivisionError: if self.muffled: print 'Divsion by zero is illagal' else: raise #运行程序: >>> calculator = MuffledCalulator() >>> calculator.calc('10/2') 5 >>> calculator.clac('10/0') Traceback (most recent call last): File "<pyshell#30>", line 1, in <module> calculator.clac('10/0') AttributeError: MuffledCalulator instance has no attribute 'clac' #异常信息被输出了 >>> calculator.muffled = True #现在打开屏蔽 >>> calculator.calc('10/0') Divsion by zero is illagal
Mehrere Ausnahmeklauseln
Wenn Sie das oben genannte ausführen (geben Sie zwei Zahlen ein, finden Sie Division)-Programm, geben Sie den Inhalt der Oberfläche ein, und es tritt eine weitere Ausnahme auf:
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except ZeroDivisionError: print "输入的数字不能为0!" #运行输入: >>> Enter the first number: 10 Enter the second number: 'hello.word' #输入非数字 Traceback (most recent call last): File "I:\Python27\yichang", line 4, in <module> print x/y TypeError: unsupported operand type(s) for /: 'int' and 'str' #又报出了别的异常信息
Okay! Wir können einen Ausnahmehandler hinzufügen, um diese Situation zu behandeln:
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except ZeroDivisionError: print "输入的数字不能为0!" except TypeError: # 对字符的异常处理 print "请输入数字!" #再来运行: >>> Enter the first number: 10 Enter the second number: 'hello,word'
Bitte geben Sie eine Zahl ein!
Ein Block zum Abfangen mehrerer Ausnahmen
Natürlich können wir auch einen Block verwenden, um mehrere Ausnahmen abzufangen:
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except (ZeroDivisionError,TypeError,NameError): print "你的数字不对!
"
Alle Ausnahmen abfangen
Auch wenn das Programm nach dem Ausführen mehrere Ausnahmen behandelt, wie das obige Programm, was passiert, wenn ich den folgenden Inhalt eingebe
>>> Enter the first number: 10 Enter the second number: #不输入任何内容,回车 Traceback (most recent call last): File "I:\Python27\yichang", line 3, in <module> y = input('Enter the second number: ') File "<string>", line 0 ^ SyntaxError: unexpected EOF while parsing
Was sollen wir tun? Es gibt immer Situationen, die wir versehentlich ignorieren. Wenn wir wirklich einen Code verwenden möchten, um alle Ausnahmen abzufangen, können wir ihn außer „Ignorieren“ verwenden alle Ausnahmeklassen in der Klausel:
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except: print '有错误发生了!' #再来输入一些内容看看 >>> Enter the first number: 'hello' * )0
Ein Fehler ist aufgetreten
Ende
Keine Sorge! Lassen Sie uns über die letzte Situation sprechen. Okay, der Benutzer hat versehentlich die falschen Informationen eingegeben. Können wir ihm eine weitere Chance zur Eingabe geben? Wir können eine Schleife hinzufügen, um sicherzustellen, dass sie endet, wenn Sie Folgendes verlieren:
while True: try: x = input('Enter the first number: ') y = input('Enter the second number: ') value = x/y print 'x/y is',value except: print '列效输入,再来一次!' #运行 >>> Enter the first number: 10 Enter the second number: 列效输入,再来一次! Enter the first number: 10 Enter the second number: 'hello' 列效输入,再来一次! Enter the first number: 10 Enter the second number: 2 x/y is 5