Python的异常机制基本就三个吧,try except(finally),raise , assert。一度很迷茫这么多异常机制 感觉仅用一个就可以啊,比如说raise和assert,完全可以相同作用。但是还是找了一些资料来解释记录一下:
try except
首先是最常用的,在程序中如果不想报错后服务就挂了,就需要用好try异常机制。
如果在 try 语句块中发生异常,程序将跳转到 except 语句块。
这里就不再赘述了,因为这个知识点已经很常见了。
try:
# 可能引发异常的代码
# ...
except SomeException:
# 处理 SomeException 的代码
# ...
raise
在Python中,raise语句的作用是主动触发异常。
在不与try结合的情况下,主动raise异常就相当于让程序结束了。如下:
x = 10
if x <= 0:
raise ValueError("x 应该是正数")
但是raise常用的方法是与try结合使用。
- 在try块中处理完异常后,仍需要将异常抛出,让上层调用者感知或者捕获异常。
如下:
class MyError(Exception):
pass
try:
raise MyError('something wrong happened')
except Exception as e:
print('My error')
raise
# 输出如下
'''
My error
Traceback (most recent call last):
File "E:test.py", line 4, in <module>
raise MyError('something wrong happened')
__main__.MyError: something wrong happened
'''
assert
assert 用于检查代码中的条件是否为真。如果条件为假,assert 语句将引发 AssertionError 异常,通常用于开发和测试阶段,以检查代码中的不变性条件是否得到满足。
我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃。代码示例如下:
def zero(s):
a = int(s)
assert a > 0,"a超出范围" #这句的意思:如果a确实大于0,程序正常往下运行
return a
zero("-2") #但是如果a是小于0的,程序会抛出AssertionError错误,报错为参数内容“a超出范围”
自定义异常类
最后再来说一下自定义异常类吧,主要目的是增加报错的可读性,丰富报错信息,其实没有自定义异常类也是可以的。 具体的定义方法也很简单,下面贴两个代码大家可以自己跑一下看一下, 我相信就会对自定义异常类有了一个充分的认识,授人以鱼不如授人以渔。
class CustomError(Exception):
def __init__(self, message="发生了自定义错误"):
self.message = message
super().__init__(self.message)
# 使用自定义异常类
def divide(a, b):
if b == 0:
raise CustomError("除数不能为零")
return a / b
# 测试
try:
result = divide(10, 0)
print(result)
except CustomError as ce:
print(f"捕获到自定义异常: {ce}")
# raise 这里可以加一个raise试试看,这样可以更深刻的理解本文所讲。
except Exception as e:
print(f"捕获到异常: {e}")
class MyCustomException(Exception):
'''我的自定义异常类'''
def __init__(self, message, error_code):
super().__init__(message)
self.error_code = error_code
try:
raise MyCustomException('Something wrong happened', 500)
except MyCustomException as e:
print(e.__doc__)
print('Error message:', e)
print('Error code:', e.error_code)