python3异常处理
1、语法错误和异常
语法错误是在代码执行前可以检测的,由于不符合代码语法规范引起的
异常指程序运行过程中导致的超出预期处理能力的情况
常见的异常:
0作为除数
未定义的对象被直接使用,比如参与运算或者调用其属性和方法
str类型直接和非str类型相加
输入输出与系统异常等
异常有两种处理方式:直接捕获进行处理,将其抛出由上级(调用异常代码)进行处理
2、捕获
(1)完整结构
try:
执行代码
except:
发生异常时执行的代码
else:
没有异常时执行的代码
finally:
无论是否发生异常时执行的代码
else和finally结构是可以省略的
finally结构实际可以考虑直接放在外部,这里主要是为了逻辑阐述的强迫性,保持功能的完整
一般关闭资源之类的操作会习惯放在finally在
(2)except
try:
pass
except OSError as err
print("OS error: {0}".format(err))
except ValueError:
pass
except (RuntimeError, TypeError, NameError):
pass
except:
pass
try后可以跟多个except结构,从上到下匹配,匹配到后即执行,不再匹配其它except结构,而是考虑except之和else或者finally结构
一般将描述越详细的异常类型放在前面,将描述越宽广的类型放在后面
如果except后没有跟异常类型,表示匹配所有异常类型,一般放在except的末尾
except … as …结构为异常取一个别名,一般是考虑到异常类型会比较详细显得冗长,起一个简短的别名,方便在except内部使用
如果多个异常的处理方法一致,可以在一个except后添加一个元组,在元组中声明并列的多个异常类型
3、抛出
使用关键字raise,其后跟一个Exception的对象或者其类型的子类型的对象,完成抛出
if x > 5:
raise Exception('这里发生了异常,x>5')
一个方法中存在抛出异常的行为,则调用该方法的代码需要进行捕获,捕获的类型为抛出时创建的异常类型
4、自定义异常
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
一般自定义异常,就是创建一个能够显示异常类型的类名的类,不需要做其它操作
其作用就是记录异常类型和异常信息,在传递过程中方便被调用查看
5、__init__方法中的异常
(1)一般来说,如果发生异常不进行处理,程序会直接结束
(2)异常处理,即except,对于其它行代码来说,相当于try结构中发生异常的代码行及其后不存在,而异常代码行之前的代码和except结构中的代码有效。
try:
name = 'aa'
age = 1/0
sex = 'boy'
except Except as e:
age = 18
- age=1/0,发生异常。此时age和sex相当于未定义
- except结构中,当发生异常时,执行
(3)__init__方法中也可能发生异常
当初始化方法内发生异常,立即try...except捕获
- 如果异常代码是进行赋值,则赋值变量相当于未声明
当初始化方法内发生异常,不进行处理,而是上层进行捕获处理
- 相当于对象未声明
- __init__方法中也可能发生异常
- 初始化方法中发生异常,只要对异常部分进行捕获处理,就可以正常执行其余部分,此时该对象存在,但是接收异常的对象变量不存在。