python - 异常处理
目录
1. 错误与异常
1.1 什么是错误
• 语法错误(大小写拼写错误、括号不匹配等...)=> 不能正常执行
• 逻辑错误(程序运行正常,只是最后结果不符合预期)
################################################
1.2 什么是异常
• 程序运行过程中,出现的意料之外的错误
• 如:打开的文件不存在、被除数为0、操作的数据类型不对、存储错误,互联网请求错
误
################################################
1.3 回溯信息
• 当程序运行时,发生了未处理的异常,Python就将终止执行程序,并以堆栈回溯(Traceback,也
称向后追踪)的形式显示异常发生的上下文。
• 回溯信息告诉我们应该去哪里寻找问题的根源,对解决问题非常有帮助。
################################################
2. 常见异常类
################################################
2.1 NameError :
print(abc)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
NameError: name 'abc' is not defined
################################################
2.2 IndexError
a=[1,2,3]
print(a[5])
Traceback (most recent call last):
File <stdin>, line 1, in <module>
IndexError: list index out of range
################################################
2.3 ZeroDirvisionError
print(1/0)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
ZeroDivisionError: division by zero
################################################
2.4 AttributeError 属性异常
a = xxx
a.yy()
Traceback (most recent call last):
File <stdin>, line 1, in <module>
AttributeError: 'str' object has no attribute 'yy'
################################################
2.5 ValueError
int(abc)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
################################################
2.6 AssertionError
断言错误
常常用在测试上面
a=4
b=3
assert a<b
Traceback (most recent call last):
File <stdin>, line 1, in <module>
AssertionError
################################################
3. 异常处理
异常处理
在代码被解释执行的过程中可能会抛出异常。
那么也就是说,可能会发生,可能不会发生。对于这么不可预测的异常状态如何处理?
1:即使程序出错,也不想让程序终止
2:如果出错了,需要特殊处理
异常处理机制 try...except...Python异常处理
简单的异常处理的格式
执行顺序:
• 正常执行:
try -> 执行代码 -> 结束
• 遇到异常:
################################################
3.1 单个异常处理
try -> 遇到异常 -> 跳到excep -> 结束
# 如果捕获到异常就处理except里的内容
try:
print("打开文件aa")
fp = open("aa")
except:
print("文件未找到")
print("end......")
################################################
3.2 多个异常处理
指定了捕获异常,就只会捕获这一种异常
except 捕获的错误与触发的错误不一致,程序就捕获不到,异常会照常抛出
可以指定多个异常
匹配到第一个就退出
父类异常 子类异常
老师(父类) --高中老师,初中老师
Exception --FileNotFoundError
Exception 是大多数异常类的父类
如果有多个异常捕获第一个异常就会抛出
异常发生了,那try监控的这段代码后面就不会执行了
所以可以将父类异常放到最后
try:
print("打开文件aa")
fp = open("aa")
print(abc)
except Exception as e:
print(f'Exception {e}')
except ZeroDivisionError as ze:
print("文件未找到")
except FileNotFoundError as fe:
print("文件不存在")
print("end......")
E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
打开文件aa
Exception [Errno 2] No such file or directory: 'aa'
end......
Process finished with exit code 0
################################################
3.3 else 结构
没有任何异常发生就会执行else语句
else结构
没有任何异常发生的情况就会执行else的语句
try:
print("else....")
except:
print("error")
else:
print("else end...")
E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
else....
else end...
Process finished with exit code 0
################################################
3.4 finally 结构
# finally 结构,不管异常有没有被捕获都执行
try:
print("finally test")
a = 1/0
except ZeroDivisionError:
print("error")
else:
print("test else...")
finally:
print("finally test end...")
E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
finally test
error
finally test end...
Process finished with exit code 0
#在函数里面即使return退出了还是会执行finally结构
def finally_func():
try:
print("try test")
return "abc"
except:
print("error")
finally:
print("finally ...")
a= finally_func()
print(a)
################################################
3.5 手动抛出异常 raise
# 手动抛出异常
# raise 异常类
# raise 异常类 (“异常信息”)
raise ZeroDivisionError("异常信息")
raise IndexError("index error")
try:
grades = int(input("请输入一个整数:"))
if grades < 0 or grades > 100:
raise IndexError("数字不在1-100之间")
except IndexError as fe:
print(fe)
except ValueError as fi:
print(fi)
else:
print(grades)
E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
请输入一个整数:200
数字不在1-100之间
Process finished with exit code 0
E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
请输入一个整数:2.1
invalid literal for int() with base 10: '2.1'
Process finished with exit code 0
################################################
3.6 关于性能
try里面套循环要比for循环里面套try运行时间短
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通