本文大部分内容来源于:官方文档之errors
处理异常
单个except
>>> while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
try 语句的工作原理如下:
多个except子句
触发第一个匹配到的except之后就停止,不会再触发后边的异常,所以多个except子句的顺序很重要
... except (RuntimeError, TypeError, NameError):
... pass
else和finally
try…except…else
- 只有try部分没有抛出异常,才执行else部分
- else必须放在所有except子句之后
-
try…except…finally
try…except…else…finally
如果没有抛出异常,先执行else,再执行finally
- 如果有异常抛出,则不执行else,执行finally
强制触发异常-raise
raise后面直接跟要触发的异常
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: HiThere
如果raise后边跟没有初始化的类名,则会利用没有参数的构造函数隐式实现实例化
raise ValueError # 相当于raise ValueError()
如果raise后边啥都不跟,则重新抛出原有被处理的异常
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: HiThere
链式异常
raise RuntimeError from exc
,其中exc必须是Exception类的实例或者None内置异常及其类层次结构
官方文档鼓励使用Exception或者它的子类自定义异常,而不是使用BaseException类
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning