异常
异常
一、异常捕获-单个异常
'''
异常简介:
概述:
Python中把程序出现的所有非正常情况统称为异常, 异常也就是我们所说的Bug.
程序遇到异常后会发生如下的两种情况:
1. 如果我们没处理异常, 则程序遇到异常后, 会终止执行, 这个也是默认的处理方式.
2. 如果我们处理了异常, 则程序会继续向下执行.
格式:
try:
这里写可能会出现问题的代码
except [异常类型 as 别名]: # 这里的[]的意思是, 可选, 即: 可写可不写
这里写的是出现问题后的解决方案
else:
如果代码没有出问题, 则执行这里的内容.
finally:
无论代码是否出问题, 最终都会走这里, 一般用于释放资源
'''
print('start')
# 入门格式
# try:
# # print(10 / 0)
# f = open('./2.txt', 'r', encoding='utf-8')
# except:
# # f = open('./2.txt', 'w', encoding='utf-8')
# print('出问题了, 文件不存在, 赶紧联系运维, 电话是: 111...')
try:
# print(10 / 0)
f = open('2.txt', 'r', encoding='utf-8')
except FileNotFoundError:
# f = open('./2.txt', 'w', encoding='utf-8')
print(f'出问题了 {FileNotFoundError}')
print('end')
二、异常捕获-多个异常
'''
异常捕获格式:
try:
这里写可能会出现问题的代码
except [异常类型 as 别名]: # 这里的[]的意思是, 可选, 即: 可写可不写
这里写的是出现问题后的解决方案
else:
如果代码没有出问题, 则执行这里的内容.
finally:
无论代码是否出问题, 最终都会走这里, 一般用于释放资源
'''
# 版本1: 捕获多个异常
# print('start')
#
# try:
# # print(10 / 0)
# f = open('./2.txt', 'r', encoding='utf-8')
# except (FileNotFoundError, ZeroDivisionError):
# # f = open('./2.txt', 'w', encoding='utf-8')
# print(f'出问题了 ') # 无法在这里提示具体的异常信息.
#
# print('end')
# 版本2: 给异常起别名.
# print('start')
#
# try:
# print(10 / 0)
# # f = open('./2.txt', 'r', encoding='utf-8')
# except (FileNotFoundError, ZeroDivisionError) as e:
# # f = open('./2.txt', 'w', encoding='utf-8')
# print(f'出问题了 {e}')
#
# print('end')
# 版本3: 实际开发中, 处理多个异常的写法如下, 因为Python中是有很多种异常的, 我们不可能每一个都考虑的非常周全, 所以一般写
# 所有异常的父对象, 即: Exception
print('start')
try:
# print(10 / 0)
f = open('2.txt', 'r', encoding='utf-8')
# print('abc' + 10)
except Exception as e:
# f = open('./2.txt', 'w', encoding='utf-8')
print(f'出问题了 {e}') # 实际开发中, 异常信息是要写入日志的, 如果异常过于严重, 则会触发 告警系统, 并通知相关人员.
print('end')
三、异常捕获-完整格式
'''
异常捕获格式:
try:
这里写可能会出现问题的代码
except [异常类型 as 别名]: # 这里的[]的意思是, 可选, 即: 可写可不写
这里写的是出现问题后的解决方案
else:
如果代码没有出问题, 则执行这里的内容.
finally:
无论代码是否出问题, 最终都会走这里, 一般用于释放资源
执行流程:
1. 先执行try里边的内容, 如果出现问题后, 无论try里边是否还有代码, 都不执行了, 直接跳到 except中.
2. except中写的是出现问题后的解决方案, 这些解决方案, 可以根据你的项目进行自定义.
3. 如果try里边内容没有出现异常, 则执行else里边的内容.
4. 最后, 无论try里边是否出错, 都会执行finally里边的内容.
大白话解释:
1. 先执行try, 看是否出问题.
2. 出问题走 except, 不出问题走 else
3. 无论是否出问题, 都走finally
快捷键: ctrl + alt + T 代码补齐
'''
try:
# 里边写的是可能出问题的代码
print(10 / 2)
print('看看我执行了吗? try')
except Exception as e:
# 出问题后的解决方案
print(f'出问题了, 问题原因: {e}')
else:
print('try里边没有问题才会走这里, 我是 else')
finally:
print('无论try是否有问题, 都会走这里, 这里是finally')
四、异常捕获-读取文件数据
'''
需求: 读取当前项目下的1.txt文件的信息, 如果文件不存在, 不要报错, 提示即可, 程序继续执行.
'''
try:
# 可能出问题的代码
# 1. 获取文件对象.
f = open('1.txt', 'r', encoding='utf-8')
except Exception as e:
print(f'出问题了, 问题原因是: {e}')
else:
# 没有出问题, 就走这里.
# 2. 读取文件内容.
data = f.read()
# 3. 打印读取到的内容
print(data)
# 4. 释放资源
f.close()
finally:
# 无论是否出问题, 都会走这, 一般用于释放资源.
print('程序结束了')
五、异常的传递性
'''
异常的传递性解释:
概述:
所谓的异常的传递性指的是 函数会将它的异常传给它的调用者, 让它的调用者来处理.
而我们知道最终所有的函数都是在 main函数中执行的, 所以就意味着所有的异常都会
传到main函数中,即: 我们只要在main函数中处理了异常, 则所有异常我们就也都处理了.
例如:
main函数 调用 fun2函数, fun2函数 调用 fun1函数, 而 fun1函数有一个异常(没有处理),
则 fun1函数会把异常传给 fun2, 然后fun2会把异常传给main
'''
# 定义fun1函数
def fun1():
print('----- fun1 start -----3')
print(10 // 0) # 这里有异常了
print('----- fun1 end -------5')
# 定义fun2函数, 在其内部调用fun1函数
def fun2():
print('----- fun2 start -----2')
# 在这里调用fun1函数
fun1()
print('----- fun2 end -------6')
# 可以理解为这个就是 main函数的内容.
print('----- main start -----1')
try:
# 调用fun2函数
fun2()
except:
print('出问题了')
print('----- main end -------7')