一、 异常的概念
错误: 编译器
异常: 运行期, 程序没有正常按照期望执行
异常产生时,在对应位置产生异常类型对象,程序“暂停”,如果上下文有异常处理程序,对应处理;
没有则“异常向上传播”,报错退出;
【异常向上传播】
> 如果异常在函数中产生,会传播给函数的调用者
> 如果异常在模块的顶级位置,会传播给引用该模块的模块
eg.
def N()
print(1/0)
def A():
N()
二、 异常的常见类型
1. BaseException
--- 所有异常的父类
Exception
--- 普遍异常,BaseException的子类,处理普遍的异常子类
(1) ZeroDivisionError
除数为0的异常
(2) NameError
名字错误异常,在命名空间中找不到抛出异常
(3) TypeError
类型不匹配
(4) AttributeError
属性异常
(5) IndentationError
缩进异常
(6) IndexErroe
索引越界异常
(7) UnboundLocalError
局部变量访问异常, 未初始化
(8) AssertionError
断言异常,即断言调试时异常
(9) ImportError
模块不存在
(10)KeyError
字典中的Key不存在
(11)ReferenceError
递归异常
(12)SyntaxError
语法错误
(13)StopIteration
迭代终止异常
(14)ValueError
数值异常,如int('a')
三. 异常处理
1. try - expect
处理格式:
try:
可能产生异常的程序
except 异常类型1:
恢复措施
except 异常类型2:
恢复措施
……
except 异常类型n:
恢复措施
注意:
excrpt :
# 此时全部异常被捕获
2. try - expect的处理情形:
(1) try语句块没有产生异常
--- 没有异常,继续执行try-except之后的语句
(2) try语句块中产生异常,except捕获了该异常
--- 执行先匹配成功的分支
--- 异常的合并,(异常类型1,异常类型2...)
(3) try语句块中产生异常,且except没有捕获该异常
--- 异常会继续向上传播(传播给函数的调用端或模块的引入处)
注意:
异常处理的时候,一般都是在调用端进行捕捉异常,以方便对异常进行不同的处理。
注意:
> 不能捕捉的异常属于编译器出现的错误
> except分支之间存在继承关系,需要将父类异常放在子类异常的后面
3. 异常中的finally和else
(1) 格式:
try:
可能异常
excepy 异常种类:
处理异常
else:
子句: 没有异常时执行,有异常抛出则不执行
finally:
子句: 无论有没有抛出异常都会执行
(2) 作用:
else:
finally: 必须操作,如释放资源、关闭文件、关闭数据库
eg.
def fun():
x = 1
try:
return x
finally:
#① return 3
#② x = 2
fun()
如果:① 3 --- 如果两个return, finally的覆盖了前面的
② 1 ---
4. 强制异常
(1) 格式
raise 异常类型
(2) 用法
a. except
b. 直接抛出异常
eg1.
try:
1/0
expert:
print('出现了除数为0的异常')
raise ZeroDivisionError
eg2.
raise ZeroDivisionError('除数为0的异常')
四、 自定义异常
格式:
继承自Exception
重写__init__
class MyException(Exception):
def __init__(self.value):
self.value = value
# except 异常类型 as 变量:
变量会绑定异常对象
try
raise MyException()
except MyException as err:
print(err.value)