异常处理
知识储备
1、什么是异常
异常是错误发生的信号
程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出,程序的运行也随之中止。
try 和 if 的区别:
if:是可预知的错误或异常场景。
try:是不可预知的异常场景,且异常已发生做出的应对手段。
分支判断:
1 try: 2 print('start...') 3 x = 1 4 y 5 l = [] 6 # l[3] 7 d = {'a':1} 8 # d['b'] 9 import os 10 os.aaa 11 print('end...') 12 except NameError: 13 print('变量名未定义') 14 except KeyError: 15 print('字典的key不存在') 16 except IndexError: 17 print('索引超出列表的范围') 18 19 print('other...') 20 21 """ 22 start... 23 变量名或者字典的key或者列表的索引有问题 24 other... 25 """
注意:
粗略的判断:
1 try: 2 print('start...') 3 x = 1 4 y 5 l = [] 6 # l[3] 7 d = {'a':1} 8 # d['b'] 9 import os 10 os.aaa 11 print('end...') 12 except (NameError,KeyError,IndexError): 13 print('变量名或者字典的key或者列表的索引有问题') 14 15 print('other...') 16 17 """ 18 start... 19 变量名或者字典的key或者列表的索引有问题 20 other... 21 """
万能异常(初级):
1 try: 2 print('start...') 3 x = 1 4 y 5 l = [] 6 # l[3] 7 d = {'a':1} 8 # d['b'] 9 import os 10 os.aaa 11 print('end...') 12 except Exception: 13 print('万能异常--》') 14 15 print('other...') 16 17 """ 18 start... 19 万能异常--》 20 other... 21 """
万能异常(高级):
1 try: 2 print('start...') 3 x = 1 4 y 5 l = [] 6 # l[3] 7 d = {'a':1} 8 # d['b'] 9 import os 10 os.aaa 11 print('end...') 12 except Exception as e: 13 print('万能异常--》',e) 14 15 print('other...') 16 17 """ 18 start... 19 万能异常--》 name 'y' is not defined 20 other... 21 """
正题总结:
# try:...else...
# else不能单独使用,必须与except连用,意思是:else的子代码快在程序没检测到任何异常的情况下执行
1 try:
2 print('start...')
3 x = 1
4 # y
5 l = []
6 # l[3]
7 d = {'a':1}
8 # d['b']
9 import os
10 # os.aaa
11 print('end...')
12
13 except Exception as e:
14 print('万能异常--》',e)
15
16 else:
17 print('else的子代码快在程序没检测到任何异常的情况下执行')
18
19 print('other...')
20
21 """
22 start...
23 end...
24 else的子代码快在程序没检测到任何异常的情况下执行
25 other...
26 """
# try:...finally...
# 完整语法如下:
1 try:
2 print('start...')
3 x = 1
4 y
5 l = []
6 # l[3]
7 d = {'a':1}
8 # d['b']
9 import os
10 # os.aaa
11 print('end...')
12
13 except Exception as e:
14 print('万能异常--》',e)
15
16 else:
17 print('else的子代码快在程序没检测到任何异常的情况下执行')
18 finally:
19 print('无论有没有异常发生,都会执行')
20
21 print('other...')
22
23 """
24 start...
25 万能异常--》 name 'y' is not defined
26 无论有没有异常发生,都会执行
27 """
# 主动触发异常
1 class People: 2 def __init__(self,name): 3 if not isinstance(name,str): 4 raise TypeError('%s 必须是str类型' % name) 5 self.name = name 6 p = People(123) 7 8 9 """ 10 raise TypeError('%s 必须是str类型' % name) 11 TypeError: 123 必须是str类型 12 """
# 断言
1 print('part1...') 2 3 # stu = ['egon','alex'] 4 stu = [] 5 6 assert len(stu) > 0 7 8 print('part2...') 9 print('part3...') 10 11 12 """ 13 part1... 14 AssertionError 15 """
# 自定义异常处理
1 # 自定义异常 2 class RegisterError(BaseException): 3 def __init__(self,user,msg): 4 self.user = user 5 self.msg = msg 6 7 def __str__(self): 8 return '<%s : %s>' % (self.user,self.msg) 9 10 # raise RegisterError,意指抛出RegisterError类生成的对象(obj)并打印之,故可在RegisterError类中自定义__str__方法,实现定制化异常处理 11 # obj = RegisterError(xxx) 12 # print(obj) 13 raise RegisterError('使用者','注册失败') 14 15 16 """ 17 raise RegisterError('使用者','注册失败') 18 __main__.RegisterError: <使用者 : 注册失败> 19 """