目录
异常处理
俗话说天有不测风云,对于天气的观测来说会有很多的变数,那么对于程序来说也会有相对的异常,那么什么叫异常处理呢?
就比如如果我定义了一个列表,那么我去获取列表内的一个不存在的索引的时候,就会报错(异常),为了增强程序的健壮性,我们也需要考虑异常处理的内容
以‘获取列表内的一个不存在的索引’为例:
varlist = [0, 1, 2, 3]
print(varlist[4])
会报如下异常:
Traceback (most recent call last):
File "M:/pycharm/python/python学习/132.异常处理.py", line 9, in <module> print(varlist[4])
IndexError: list index out of range
IndexError就是异常类
list index out of range就是异常信息
发生这种异常后,如果不对程序进行修改就无法执行下去,那么如果发送了一些无法预测的程序异常,就会显得非常麻烦
如下,两个数字的运算,其中一个不是数字,运算就会出错,这时就可以判断来预防问题
n1, n2 = 2, '3'
但是如果错误发生的条件不可预知,就可以使用try。。。except。。。在错误发生时进行处理
try:
n1, n2 = 2, '3'
print(n1 + n2)
except:
pass
假设读取一个不存在的文件,会发生错误,可以使用两种方式进行处理
1.可以在文件读取前先判断当前文件是否存在
2.可以使用try。。。except。。。在错误发生时进行处理。注意:是在错误发生后进行的处理
try:
with open('./111.txt','r',encoding='utf-8') as ganyu:
print(ganyu.read())
except:
print('文件不存在')
print('程序继续执行')
tryexcept用法详解
try:
r1 = 'hello'
int(r1) # 会引发ValueError
except ValueError as ganyu:
print(ganyu)
try:
r2 = 'hello'
r3 = [1, 2, 3]
print(r2 + r3)
except TypeError as tt:
print(tt)
多分支处理异常类
r4 = 'hello'
try:
int(r4)
except IndexError as gg:
print('错误')
except ValueError as pp:
print('?')
通用异常类Exception
r5 = 'hello'
try:
int(r5)
except Exception as gg:
print('错误')
多分支异常类+通用异常类
如果前面的except都不正确,则跳转Exception,就是说会按从上往下的顺序执行异常类
r4 = 'hello'
try:
int(r4)
except ValueError as gg:
print('错误')
except Exception as pp:
print('?')
finally
r6 = 7
try:
int(r6)
except ValueError as gg:
print('错误')
except Exception as pp:
print('?')
else:
print('当代码块内没有出现异常时,执行的else')
finally:
print('无论是否引发异常都会执行这个代码块,通常情况下会进行一些清理工作')
主动抛出异常
try:
raise Exception('可以控制报错的内容')
except Exception as e:
print('Exception', e)
使用自定义异常处理类进行日志的写入
在出现异常后,对异常进行处理,并且把异常信息写入日志
# 自定义异常日志处理类
class Mylogpetion():
def __init__(self):
import traceback # 回溯模块
import logging # 用于写日志的模块
# logging的基本配置
logging.basicConfig(
filename='M:\python文件写入测试\日志.txt', # 当前文件写入位置
format='%(asctime)s %(levelname)s \n %(message)s', # 格式化存储的日志格式
# 日期时间 级别 错误信息
datefmt='%Y-%m-%d %H:%M:%S'
)
# 写入日志
logging.error(traceback.format_exc())
# 使用自定义异常处理类
try:
int('aaa')
except:
# 在此处进行异常处理
Mylogpetion() # 在异常处理的代码块中调用自定义异常类