文章目录
介绍
- 常用的异常类继承关系
- 异常类的捕捉
- 同时处理多个异常
- raise异常
- 自定义异常
常用异常类继承关系
SystemExit:该异常通常是由sys.exit()函数引发的,用于请求程序的正常退出,当程序执行到这个异常时,会终止当前进程,并返回到调用它的父进程或者命令行终端。
KeyboardInterupt:通常由用户执行中断操作,比如按下Ctrl+C来终止当前正在运行的程序。当程序执行到这个异常的时候,会立即停止当前操作并跳出当前的代码块。
Exception: 如果我们想自定义异常,我们的异常应该继承自该类
异常类的捕捉
在try...except...语句中,可以使用特定的异常类来捕捉错误,也可以使用父类型的异常类来捕捉。如何理解这句话呢?
代码示例:
python
def main():
num = 2
s = 0
res = num/s
print(res)
if __name__ == "__main__":
main()
上述代码会报错:(因为我们除以了一个0)
File "test.py", line 47, in main
res = num/s
~~~^~
ZeroDivisionError: division by zero
这个时候我们可以使用try...except...来防止程序崩溃
python
def main():
try:
num = 2
s = 0
res = num/s
print(res)
except ZeroDivisionError:
print("error")
if __name__ == "__main__":
main()
当我们点进去ZeroDivisionError
这个异常时我们发现,它继承自ArithmeticError
这个异常类,因此我们修改程序,使用父类型的异常类来捕捉,程序也不会崩溃:
python
def main():
try:
num = 2
s = 0
res = num/s
print(res)
except ArithmeticError:
print("error")
if __name__ == "__main__":
main()
注意:不能用一个与ZeroDivisionError
不相关的类型去捕捉异常,否则会导致程序崩溃
同时处理多个异常
在同时捕捉多个异常的时候,需要先捕捉子类型的异常,后捕捉父类型的异常。
如果先抓夫类型的异常,子类型永远不会有机会被抓住
raise异常
可以在代码中通过raise异常的方式来向调用者返回错误信息
python
raise 异常类对象
代码示例:
python
def add(n1, n2):
if not isinstance(n1, int) or not isinstance(n2, int):
raise Exception("Argument is not int")
return n1 + n2
if __name__ == "__main__":
try:
add(1,"2")
except Exception as e:
print(e)
代码输出:
bash
Argument is not int
自定义异常类
通过继承Exception类来自定义一个异常类
python
class InvalidArgumentException(Exception):
def __init__(self, *args):
super().__init__(args)
def add(n1, n2):
if not isinstance(n1, int) or not isinstance(n2, int):
raise InvalidArgumentException("Argument is not int")
return n1 + n2
if __name__ == "__main__":
try:
add(1,"2")
except InvalidArgumentException as err:
print(err)
本文参考: