本文大部分内容来源于:官方文档之errors

处理异常

单个except

  1. >>> while True:
  2. ... try:
  3. ... x = int(input("Please enter a number: "))
  4. ... break
  5. ... except ValueError:
  6. ... print("Oops! That was no valid number. Try again...")

try 语句的工作原理如下:

  • 首先,执行 try 子句tryexcept 关键字之间的(多行)语句)。
  • 如果没有触发异常,则跳过 except 子句try 语句执行完毕。
  • 如果执行 try 子句时发生了异常,则跳过该子句中剩下的部分。如果异常的类型与 except 关键字后面的异常匹配,则执行 except 子句,然后,继续执行 try 语句之后的代码。
  • 如果发生的异常不是 except 子句中列示的异常,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,语句执行将终止,并显示如上所示的消息。

多个except子句

触发第一个匹配到的except之后就停止,不会再触发后边的异常,所以多个except子句的顺序很重要

  1. ... except (RuntimeError, TypeError, NameError):
  2. ... pass

else和finally

try…except…else

  1. 只有try部分没有抛出异常,才执行else部分
  2. else必须放在所有except子句之后

  3. try…except…finally

    无论try部分有没有抛出异常,finally部分都会执行

    try…except…else…finally

  4. 如果没有抛出异常,先执行else,再执行finally

  5. 如果有异常抛出,则不执行else,执行finally

强制触发异常-raise

  1. raise后面直接跟要触发的异常

    1. >>> raise NameError('HiThere')
    2. Traceback (most recent call last):
    3. File "<stdin>", line 1, in <module>
    4. NameError: HiThere
  2. 如果raise后边跟没有初始化的类名,则会利用没有参数的构造函数隐式实现实例化

    1. raise ValueError # 相当于raise ValueError()
  3. 如果raise后边啥都不跟,则重新抛出原有被处理的异常

    1. >>> try:
    2. ... raise NameError('HiThere')
    3. ... except NameError:
    4. ... print('An exception flew by!')
    5. ... raise
    6. ...
    7. An exception flew by!
    8. Traceback (most recent call last):
    9. File "<stdin>", line 2, in <module>
    10. NameError: HiThere

    链式异常

    raise RuntimeError from exc,其中exc必须是Exception类的实例或者None

    内置异常及其类层次结构

    官方文档鼓励使用Exception或者它的子类自定义异常,而不是使用BaseException类

    1. BaseException
    2. +-- SystemExit
    3. +-- KeyboardInterrupt
    4. +-- GeneratorExit
    5. +-- Exception
    6. +-- StopIteration
    7. +-- StopAsyncIteration
    8. +-- ArithmeticError
    9. | +-- FloatingPointError
    10. | +-- OverflowError
    11. | +-- ZeroDivisionError
    12. +-- AssertionError
    13. +-- AttributeError
    14. +-- BufferError
    15. +-- EOFError
    16. +-- ImportError
    17. | +-- ModuleNotFoundError
    18. +-- LookupError
    19. | +-- IndexError
    20. | +-- KeyError
    21. +-- MemoryError
    22. +-- NameError
    23. | +-- UnboundLocalError
    24. +-- OSError
    25. | +-- BlockingIOError
    26. | +-- ChildProcessError
    27. | +-- ConnectionError
    28. | | +-- BrokenPipeError
    29. | | +-- ConnectionAbortedError
    30. | | +-- ConnectionRefusedError
    31. | | +-- ConnectionResetError
    32. | +-- FileExistsError
    33. | +-- FileNotFoundError
    34. | +-- InterruptedError
    35. | +-- IsADirectoryError
    36. | +-- NotADirectoryError
    37. | +-- PermissionError
    38. | +-- ProcessLookupError
    39. | +-- TimeoutError
    40. +-- ReferenceError
    41. +-- RuntimeError
    42. | +-- NotImplementedError
    43. | +-- RecursionError
    44. +-- SyntaxError
    45. | +-- IndentationError
    46. | +-- TabError
    47. +-- SystemError
    48. +-- TypeError
    49. +-- ValueError
    50. | +-- UnicodeError
    51. | +-- UnicodeDecodeError
    52. | +-- UnicodeEncodeError
    53. | +-- UnicodeTranslateError
    54. +-- Warning
    55. +-- DeprecationWarning
    56. +-- PendingDeprecationWarning
    57. +-- RuntimeWarning
    58. +-- SyntaxWarning
    59. +-- UserWarning
    60. +-- FutureWarning
    61. +-- ImportWarning
    62. +-- UnicodeWarning
    63. +-- BytesWarning
    64. +-- ResourceWarning