Python 异常
异常就是程序运行的过程中出现了错误
bug就是指异常的意思,因为历史上因为小虫子慌到计算机失灵的案例,所以延续至今,bug就代表软件出现了错误
异常举例如下: FileNotFoundError: [Errno 2] No such file or directory: './img/error.txt'
f = open("./img/error.txt","r") # 如果error.txt文件不存在,则抛出异常如下
# FileNotFoundError: [Errno 2] No such file or directory: './img/error.txt'
捕获异常
世界上没有完美的程序,在力所能及的范围内,对可能出现的BUG,进行提前准备、提前处理
这种行为我们称之为: 异常处理 (捕获异常)
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段
语法示例:
try:
print(name)
except NameError as e:
print("name变量名称未定义错误")
注意:
- 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
- 一般try下方只放一行尝试执行的代码
try:
f = open("./img/error.txt","r",encoding="UTF-8")
except FileNotFoundError as a:
print("如果出现异常,因为文件不存在,将open的模式改为w模式要以自已创建文件")
f = open("./img/error.txt","w",encoding="UTF-8")
print(a) # 打印捕获的异常具体信息
else:
print("程序执行完美,没有异常")
f = open("./img/error.txt","r",encoding="UTF-8")
f.close()
程序执行完美,没有异常
- 捕获多个异常 (FileNotFoundError, NameError)
try:
f = open("./img/error.txt","r",encoding="UTF-8")
print(name)
except (FileNotFoundError, NameError) as a:
print("如果出现异常,因为文件不存在,或者变量未被定义")
print(a) # 打印捕获的异常具体信息
如果出现异常,因为文件不存在,或者变量未被定义
[Errno 2] No such file or directory: './img/error.txt'
- 捕获所有异常 Exception
try:
1 / 0
f = open("./img/error.txt","r",encoding="UTF-8")
print(name)
except Exception as e:
print("如果出现异常,因为文件不存在,或者变量未被定义")
print(e) # 打印捕获的异常具体信息
else:
print("程序执行完美,没有异常")
如果出现异常,因为文件不存在,或者变量未被定义
division by zero
- 异常的finally
finally 表示的是无论是否异常都要执行的代码,例如关闭文件
try:
1 / 0
f = open("./img/error.txt","r",encoding="UTF-8")
print(name)
print("哈哈")
except Exception as e:
print("如果出现异常,因为文件不存在,或者变量未被定义")
print(e) # 打印捕获的异常具体信息
else:
print("程序执行完美,没有异常")
finally:
print("finally 无论有没有异常我都要执行")
f.close()
如果出现异常,因为文件不存在,或者变量未被定义
division by zero
finally 无论有没有异常我都要执行
异常的传递
异常是具有传递性的,当所有函数都没有捕获异常的时候,程序就会报错
如下例:当函数func01中发生异常,并且没有捕获这个异常的时候,异常会传递到函数func02,当func02也没有捕获这个异常的时候
main函数会捕获这个异常,这就是异常的传递性
def func01(): # 异常在func01中没有被捕获
print("这是func01开始")
num = 1 / 0 # 异常代码
print("这是func01结束")
def func02(): # 异常在func02中没有被捕获
print("这是func02开始")
func01()
print("这是func02结束")
def main():
try:
func02()
except Exception as e:
print("异常在main函数中被捕获")
print(e)
main()
这是func02开始
这是func01开始
异常在main函数中被捕获
division by zero