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子句都执行
运行结果截图如下: