1 python的异常体系
异常一般指程序运行时由于出现非法数据导致的程序崩溃的行为
如在python当中有以下异常(只简单列举几个,具体见官方文档:https://docs.python.org/zh-cn/3/library/exceptions.html):
- NameError:一般是没有声明就使用变量引起的
- KeyError:一般是操作字典/列表选择的key数据或者编号数据有误引起的
- IndexError:一般是操作列表时索引编号使用不当引起的
- ValueError:一般是数据操作有误引起的如数据类型转换
- KeyboardInterupt:一般是由于用户通过键盘终止程序引起的
BaseException和Exception:
- BaseException:
所有异常的直接或者间接父类
- Exception:
所有运行异常的直接或者间接父类(除了 SystemExit 、 KeyboardInterrupt 和 GeneratorExit 之外的所有异常)
2 异常处理
try: # 必须
可能出现异常的代码块,出现异常就会直接跳到except语句的代码中,之间的代码不会执行
except 可能出现的异常 as e: # 必须
处理异常的代码
else: # 可不写,用于将可能执行异常代码和不会出现异常点代码分开,提高可读性
代码执行没有异常执行这里的代码,没有异常才会执行
finally: # 可不写
程序运行到最后不论是否出现异常都要执行的代码,用于资源回收
2.1 处理单个异常
try:
int("凄凄不似向前声")
except ValueError as e:
print("该类型不能转换为int") # 该类型不能转换为int
2.2 处理多个异常
精确处理(异常较重要需要单独处理):
try:
int("凄凄不似向前声")
print(a)
except ValueError as e:
print("该类型不能转换为int") # 该类型不能转换为int
except NameError as e:
print("没有定义变量a")
else:
print("满座重闻皆掩泣")
finally:
print("运行完毕")
直接处理(什么异常不是关注点,需要保证程序正常运行):
try:
print(a)
except (ValueError, NameError) as e:
print("发生异常", e) # 发生异常 name 'a' is not defined
else:
print("满座重闻皆掩泣")
finally:
print("运行完毕")
2.3 处理所有异常
try:
print(a)
except BaseException as e: # BaseException或Exception,也可以只写except:
print("发生异常")
else:
print("满座重闻皆掩泣")
finally:
print("运行完毕")
3 抛出异常
主动抛出异常:程序中一种异常/错误转移的语法方式,让程序主动报错
直接报错使程序停止:
num = input("请输入1:")
if num == "1":
print("座中泣下谁最多?江州司马青衫湿")
else:
raise Exception("输入错误")
自定义异常并处理,使程序正常运行:
try:
num = input("请输入1:")
if num == "1":
print("座中泣下谁最多?江州司马青衫湿")
else:
raise Exception("输入错误")
except Exception as e:
print(e) # 输入错误
4 自定义异常
某些时候python中的异常体系不足以准确的描述可能出现的异常信息,就需要自定义异常,可使用创建对象的方法
class CustomError(Exception):
"""自定义异常"""
def __init__(self, msg): # 因为继承了Exception,也可以不写,根据需求而定
super().__init__(msg)
num = input("请输入1:")
if num == "1":
print("座中泣下谁最多?江州司马青衫湿")
else:
print("请正确输入")
raise CustomError("Error") # 相较于Exception,可更明确错误的类型名称