02-python异常处理机制

1 默认异常处理机制

当异常没被处理或者捕获时, 程序将在出现异常的地方停止, 并显示一条错误信息。

In [80]: a = 10 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-80-44ffaf72d684> in <module>()
----> 1 a = 10 / 0

ZeroDivisionError: division by zero

2 抛出异常-raise

要主动引发异常, 可以使用 raise 语句,并将Exception的一个子类或者实例作为参数。 将类作为一个参数时, 将自动创建一个实例。
语法: raise 异常类(异常名)

# 引发通用异常, 没有指出异常是什么
In [86]: raise Exception
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-86-fca2ab0ca76b> in <module>()
----> 1 raise Exception

Exception: 

# 引发异常, 并指出了异常类。 异常类可以是python内置的异常类, 也可以是自定义异常类
In [87]: raise Exception("ZeroDivisionError")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-87-3c86435167a1> in <module>()
----> 1 raise Exception("ZeroDivisionError")

Exception: ZeroDivisionError

In [88]: raise Exception("my_exception")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-88-1d426f3f7346> in <module>()
----> 1 raise Exception("my_exception")

Exception: my_exception

ps: 自定义异常类必须直接或间接继承Exception

In [89]: class my_exception(Exception):
   ....:     pass

3 捕获异常

捕获异常: 对异常进行处理,使用 try…except… 捕获异常。

  • python默认的异常处理机制是 当出现异常时, 程序将在出现异常的地方终止。如果希望在出现异常后, 程序不会立即停止, 可以进行异常捕获, 对捕获到的异常进行相应的处理。
  • 异常从函数向外传播到函数调用的地方, 如果在函数里没有捕获异常, 异常将向程序的最顶层传播。
  • except子句 可以捕获单个异常或多个异常:
    except 异常类 #捕获单个异常
    except (异常类1, 异常类2) #捕获异常类1, 异常类2, 多个异常类需要使用元组
    except Exception #可以捕获Exception异常类的所有子类
    except Exception as e #e为捕获到的异常的名字
    当有多个except子句时, 出现异常只会执行其中的一个。python解释器从上往下判断异常的类型, 只要找到了一个对应的, 就不会继续往下判断。
    ps: SystemExit 和 KeyboardInterrupt(CTRL+C) 异常是从 BaseException (Exception的父类)派生的。 所以使用 except Exception 是捕获不到这2个异常的
  • 当try的子句出现异常时:
    try … except … # 当try子句出现异常时, 执行except子句的代码块
    try … except … else … # 当try子句出现异常时, 执行except子句的代码块;没出现异常时, 执行else字句的代码块
    try … except … finally… # 不管try子句是否出现异常, 都执行finally子句的代码块;只有程序出现异常才执行except字句的代码块。
# coding: utf-8


def my_exception1(num):
    """try...except..."""
    try:
        ret = 1 / num
        print("---my_exception1未出现异常---")
    except Exception as e:
        print(e)


def my_exception2(num):
    """try...except...else..."""
    try:
        ret = 1 / num
        print("***my_exception2未出现异常***")
    except Exception as e:
        print(e)
    else:
        print("未出现异常时, else子句执行")

def my_exception3(num):
    """try...except...finnally..."""
    try:
        ret = 1 / num
        print("===my_exception3未出现异常===")
    except Exception as e:
        print(e)
    finally:
        print("不管是否出现异常, finally子句都执行")

my_exception1(1) # ---my_exception1未出现异常---
my_exception1(0) # division by zero
print("")
my_exception2(1) # ***my_exception2未出现异常***		未出现异常时, else子句执行
my_exception2(0) # division by zero
print("")
my_exception3(1) # ===my_exception3未出现异常===		不管是否出现异常, finally子句都执行
my_exception3(0) # division by zero		不管是否出现异常, finally子句都执行

运行结果截图如下:
02-python异常处理机制