异常处理
错误的分类
1.语法错误 2.逻辑错误、
异常处理只能处理代码的逻辑错误。
异常的定义
代码发生异常错误之后,程序被中断。
异常处理定义
当代码出现异常时,通过某种方法不让程序中断,合理的“跳过”异常。
异常处理的作用
1.用户体验良好
2.是代码更有健壮性和容错性
异常处理的两种方式
1.if 只能处理简单异常
2.try 异常处理的常用方式
try:
# doc = {"name": "MB", "age": 25}
# salary = doc["salary"]
num = input(">>>")
num = int(num)
except KeyError:
print("没有该键")
except ValueError:
print("请输入数字")
注意,当出现异常后程序直接转到异常处理对应部分代码,不再执行异常之后的代码内容
异常处理的几种结构
结构1:单分支
处理单个异常的异常处理
try:
num = input(">>>")
num = int(num)
except ValueError:
print("请输入数字")
结构2:多分支
try:
doc = {"name": "MB", "age": 25}
salary = doc["salary"]
num = input(">>>")
num = int(num)
l1 = [1, 2, 3]
print(l1[100])
except KeyError:
print("没有该键")
except ValueError:
print("请输入数字")
except IndexError:
print("请输入正确索引")
结构3:万能异常处理
except后不带异常类型,可以处理所有python识别的异常
try:
doc = {"name": "MB", "age": 25}
salary = doc["salary"]
num = input(">>>")
num = int(num)
l1 = [1, 2, 3]
print(l1[100])
except Exception:
pass
可以打印异常内容
try:
doc = {"name": "MB", "age": 25}
salary = doc["salary"]
num = input(">>>")
num = int(num)
l1 = [1, 2, 3]
print(l1[100])
except Exception as e:
print(e)
什么时候用万能异常,什么时候用多分支
如果对错误信息不关心,只是先排除错误让程序继续运行,则用万能异常。
如果要根据错误信息进行明确分流,让程序多元化开发则用多分支。
结构4:多分支+万能异常
try:
doc = {"name": "MB", "age": 25}
salary = doc["salary"]
num = input(">>>")
num = int(num)
l1 = [1, 2, 3]
print(l1[100])
except KeyError:
print("没有该键")
except ValueError:
print("请输入数字")
except IndexError:
print("请输入正确索引")
except Exception as e:
print(e)
print("程序出现意料之外的错误")
这种结构可以保证程序不会因为出现意料之外的异常而意外终止。最常用
结构5:try else finally
try:
doc = {"name": "MB", "age": 25}
salary = doc["name"]
num = input(">>>")
num = int(num)
l1 = [1, 2, 3]
print(l1[100])
except KeyError:
print("没有该键")
except ValueError:
print("请输入数字")
else:
print("程序未出现异常")
finally:
print("finally执行啦")
except的作用是出现异常如何运行
else的作用是未出现异常如何运行
finally内容会在异常升起前运行
except必须有try,else必须有try和except,finally只需要有try
finally作用:在异常升起之前、在break之前、在return之前执行,可以用于关闭数据库连接,数据保存,文件句柄关闭等必须要执行的操作之中。
with open("test", encoding="utf-8", mode="r+") as f:
try:
for i in f.readlines():
print(i, end="")
if i > 1:#这里会报错,但在报错前先运行finally下代码块
print("运行")
finally:
print("finally运行")
f.close()
主动触发异常
raise ValueError("出现了Value错误")
断言
通过assert判断,展现出一种强硬的态度,当assert条件为真的时候才运行接下来的部分代码,如果assert条件为假,则直接出发AssertionError异常。
a = 1
assert a == 3
print("正常运行")
自定义异常
python中给提供的错误类型很多,但不是全部的错误,有一些错误没有错误类型,可以自己定义错误类型。
class SelfDefinition(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self): # 打印该类的实例的时候出发__str__
return self.msg
try:
raise SelfDefinition("自定义类型错误")
except SelfDefinition as e:# e = SelfDefinition("自定义类型错误")
print(e) # 触发__str__