Python学习-异常处理
一、基本概念
什么是异常?
异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止。
异常的三大组成部分
- 异常的追踪信息
- 异常的类型
- 异常的内容
为何处理异常?
本来程序一旦出现异常就整体结束掉了,有了异常处理以后,在遇到错误时就会有相应的处理机制不会任由程序崩溃掉。而且我们要捕捉异常并处理,将出错信息记录到日志内。
二、如何处理异常
语法上的错误:SyntaxError
有错改错,不再赘述。
逻辑上的错误
常见逻辑错误如下:
# TypeError:数字类型无法与字符串类型相加
1+’2’
# ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)
# NameError:引用了一个不存在的名字x,没有定义
x
# IndexError:索引超出列表的限制
l=['a','b']
l[99]
# KeyError:引用了一个不存在的key
dic={'name':'山炮'}
dic['sex']
# AttributeError:引用的属性不存在
class test:
pass
test.x
# ZeroDivisionError:除数不能为0
1/0
针对逻辑上的异常又分成两种,每一种对应不同的处理方式。
-
错误发生的条件是
可以预知
的使用if判断来解决
案例:猜年龄
while (True): age = input('>>: ').strip() if age.isdigit(): # 输入的只要不是数字就会出错 age = int(age) if age > 18: print('猜大了') elif age < 18: print('猜小了') else: print('猜对了') break else: print('必须输入数字')
-
错误发生的条件是
无法预知
的使用try-except来解决,基本格式如下:
try: 被检测的代码块 # 有可能抛出异常的代码 except 异常类型: 检测到异常,就执行这个位置的代码
如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配。像下面这样:
try: 被检测的代码块 except (异常类型1,异常类型2,异常类型3): 触发类型1或类型2或类型3异常时对应的处理逻辑
完全扩展格式如下:
try: # 有可能会抛出异常的代码 子代码1 子代码2 子代码3 except 异常类型1 as e: 触发类型1异常时对应的处理逻辑 except 异常类型2 as e: 触发类型2异常时对应的处理逻辑 ... else: 如果被检测的子代码块没有异常发生,则会执行else的子代码 finally: 无论被检测的子代码块有无异常发生,都会执行finally的子代码 # 因此通常在finally的子代码块做一些回收资源的操作,比如关闭打开的文件、关闭数据库连接等
而如果我们想捕获所有异常并用同一种逻辑处理,Python提供了一个万能异常类型:
Exception
try: 被检测的代码块 except NameError: 触发NameError时对应的处理逻辑 except IndexError: 触发IndexError时对应的处理逻辑 except Exception: 其他类型的异常统一用此处的逻辑处理
因为错误发生条件无法预知的这种异常情况不易说明,我们以普通的语法错误来举例说明
try-except
的使用。例一:🖋🖋🖋
print('程序开始运行') try: print('进入try:') l = ['a', 'b'] print(l[3]) # 抛出异常IndexError,该行代码同级别的后续代码不会运行 print(x) print('出了try') except IndexError as e: print('异常的信息: ', e) print('程序结束运行') # 运行结果如下: # 程序开始运行 # 进入try: # 异常的信息: list index out of range # 程序结束运行
我们可以看到,程序在运行至
print(l[3])
处捕捉到异常IndexError
并进行处理,但try
中print(l[3])
后续代码不再被执行。例二:🖌🖌🖌
print('程序开始运行') try: print('进入try:') print(x) # 抛出异常,该行代码同级别的后续代码不会运行 print('出了try') except Exception: print('万能异常捕捉') print('程序结束运行') # 运行结果如下: # 程序开始运行 # 进入try: # 万能异常捕捉 # 程序结束运行
例三:🖍🖍🖍
else不能单独
与try
配合使用,必须要搭配except
print('程序开始运行') try: print('进入try:') # print(x) print('出了try') except Exception: print('万能异常捕捉') else: print('风平浪静,无事发生') print('程序结束运行') # 运行结果如下: # 程序开始运行 # 进入try: # 出了try # 风平浪静,无事发生 # 程序结束运行
例四:✏✏✏
finally
可以单独
与try
配合使用print('程序开始运行') try: print('进入try:') # print(x) # 异常报错:NameError: name 'x' is not defined print('出了try') finally: # 无论是否发生异常,都会执行finally的子代码 print('回收垃圾,从你我做起') print('程序结束运行') # 运行结果如下: # 程序开始运行 # 进入try: # 出了try # 回收垃圾,从你我做起 # 程序结束运行