Python手册(3) 异常处理

0. 前言

1. 内建异常类型

  • Python文档:内置异常
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 内建异常类型
    # Exception
    # AttributeError
    # IOError
    # IndexError
    # KeyError
    # ValueError
    # NameError
    # SyntaxError
    # ZeroDivisionError

2. 新建异常类型

1
2
3
4
5
class MyException(Exception): pass

class MyException(Exception):
def __init__(self, error_msg):
self.error_msg = error_msg

3. 捕获异常

3.1. 基本使用

  • try:运行可能会抛出异常的代码。
  • except:该关键字有以下多种功能
    • 捕获一个或多个特定异常
    • 捕获其他所有异常
  • else:当没有出现异常时执行
  • finally:不管如何都执行
  • 其他:
    • 抛出的异常只会被一个except捕获。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      def exception_handle():
      try:
      print("try")
      raise ValueError # 抛出特定异常
      except IndexError as e:
      # 捕获一个异常,并获取异常对象
      # 不对异常进行处理,继续抛出异常
      raise
      except (KeyError, ValueError) as e:
      # 捕获某两类异常,并获取异常对象
      print(e)
      except:
      # 捕获除了上述三种异常之外的所有异常
      print("except")
      raise # 抛出捕获到的异常
      else:
      # 当没有捕获异常时执行
      print("else")
      finally:
      # 不管是否捕获异常,都要执行
      print("finally")

3.2. 异常类的基类与派生类

  • 即抛出的异常为A,处理异常的类别为B:

    • 如果B是A的基类,则A异常会被正常捕获。
    • 如果A是B的基类(而不是同一类),A异常不会被捕获。
  • 下面代码的输出结果是 B C D

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class B(Exception):
    pass

    class C(B):
    pass

    class D(C):
    pass

    for cls in [B, C, D]:
    try:
    raise cls()
    except D:
    print("D")
    except C:
    print("C")
    except B:
    print("B")
  • 如果将except B放到最前面,则输出的结果为B B B

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class B(Exception):
    pass

    class C(B):
    pass

    class D(C):
    pass

    for cls in [B, C, D]:
    try:
    raise cls()
    except B:
    print("B")
    except D:
    print("D")
    except C:
    print("C")