本文大部分内容来源于:官方文档之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
