异常处理
异常处理
-
异常:在编译阶段没有问题,在执行阶段出现问题
-
语法错误:编译过程出错(应该在程序执行前就进行规避,不应该进行异常处理)
-
例子:
num = int(input('>>>')) print(num)
- 如果此时用户输入一个字母,程序会报出
ValueError
的异常错误,这种错误是不可控的,因为输入的数据具有随机性,所以这时需要用到异常处理
try: num = int(input('>>>')) print(num) except ValueError: print('你输入的有误。')
- 这样程序就会进行异常处理,而不会直接抛出异常。
- 如果此时用户输入一个字母,程序会报出
-
排错原则:报错信息,从下往上找
1. 异常处理核心语法和逻辑
-
核心语法
- 简单处理异常
try: #可能发生异常的代码 except 错误类型: #处理代码
-
多分支多次处理多次异常
- except之间都是互斥的
try: num = int(input('>>>')) print(num) except ValueError: print(666) except ValueError: print(999) 用户输入a 输出: 666
程序由上往下执行,遇到符合的except立刻执行不会等待,之后的代码。
-
合并多分支处理多次异常
-
将所有会产生的异常,加入到一个元组中
try: num = int(input('>>>')) print(num) except (ValueError,IndexError): print('你输入的有误')
- 由此可以用一条except语句处理ValueError和IndexError两种不同的异常
-
-
万能异常处理Exception(少用)
- 缺点:不知道什么异常
- 补充一个as语法
- 使用方法:
except Except as e
- 多分支和万能异常联合使用时,将多分支语句放在万能异常之前。
- 使用方法:
-
异常代码结构:
try: #多分支 #可能发生异常的代码 except 错误类型1: #处理代码1 except 错误类型2: #处理代码2 try: #合并多分支 #可能发生异常的代码 except (错误类型1,错误类型2): #处理代码 try: #多分支和万能异常的联合使用 #可能发生异常的代码 except (错误类型1,错误类型2): #处理代码 except Exception as e: print(e)
-
异常处理中的其他机制1—else
-
else使用逻辑:当try中全部代码全部执行完毕,才执行else下的代码
-
应用场景:发送信息等,操作需要回馈信息的场景
-
例:
try: #发邮件的逻辑 except 错误类型: #错误执行代码 else: #汇报这段代码顺利执行,发送邮件通知或者记录到文件
-
-
异常处理中的其他机制2—finally
-
执行机制:无论try中代码是否执行,是否发生异常,都会执行finally内的代码
-
使用场景:程序的首尾工作(打开了文件,占用了网络资源,打开了一个和数据的链接)
def func(): try: f = open('aaa') return f.read() finally: f.close()
-
-
异常处理的常用结构
try/except try/except/else try/finally try/except/finally try/except/else/finally
2.主动抛一个异常
-
raise语法
-
raise 错误异常
-
raise 错误异常(错误提示)
a = 666 if a == 666: raise ValueError('不准输出666') 输出: ValueError: 不准输出666
-
3.自定义异常
class AbnerException(BaseException):
def __init__(self,msg):
super().__init__()
self.msg = msg
def __str__(self):
return self.msg
raise AbnerException('Abner的异常。')
- 所有的自定义异常全部要继承
BaseException
这个所有异常的父类
4.断言
- assert类似if,但是比if更加苛刻,if不满足条件仅仅不运行,assert没有满足条件之间报错
assert 1 == 1
print(666)
assert 1 == 2
print(999)
输出:
666
AssertionError
5.总结
- 异常处理应该使用在易发生异常的代码位置,最好不要在程序开头就加上异常处理,这样会使得错误极难排查。
- 在程序交付使用后可以对整个程序进行万能异常处理,其原因在于提高用户的体验,而不至于程序发送未知错误,直接停止。