Python 允许用户自定义异常类型。实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时就可以创建一个新的异常类来拥有自己的异常。
异常类的创建,例如:
class SelfExceptionError(Exception):
pass
try:
raise SelfExceptionError()
except SelfExceptionError as err:
print("捕捉到自定义异常")
运行结果为:
捕捉到自定义异常
可以看到,此程序中就自定义了一个名为 SelfExceptionError 的异常类,只不过该类是一个空类。
由于大多数 Python 内置异常的名字都以 "Error" 结尾,所以实际命名时尽量跟标准的异常命名一样。
需要注意的是,自定义一个异常类,通常应继承自 Exception 类(直接继承),当然也可以继承自那些本身就是从 Exception 继承而来的类(间接继承 Exception)。

图 1 Python 异常类继承图
注意,虽然所有类同时继承自 BaseException,但它是为系统退出异常而保留的,假如直接继承 BaseException,可能会导致自定义异常不会被捕获,而是直接发送信号退出程序运行,脱离了我们自定义异常类的初衷。
另外,系统自带的异常只要触发会自动抛出(比如 NameError、ValueError 等),但用户自定义的异常需要用户自己决定什么时候抛出。也就是说,自定义的异常需要使用 raise 手动抛出。
下面也是自定义的异常类,和上面的异常类相比,其内部实现了 __init__() 方法和 __str__() 方法:
# ⾃自定义异常类,继承Exception
class ShortInputError(Exception):
def __init__(self, length, min_len):
self.length = length
self.min_len = min_len
# 设置抛出异常的描述信息
def __str__(self):
return f'你输⼊入的⻓长度是{self.length}, 不不能少于{self.min_len}个字符'
def main():
try:
password = input('请输⼊入密码:')
if len(password) < 3:
raise ShortInputError(len(password), 3)
except Exception as result:
print(result)
else:
print('密码已经输⼊入完成')
if __name__ == '__main__':
main()
运行结果为:
请输⼊入密码:12
你输⼊入的⻓长度是2, 不不能少于3个字符
进程已结束,退出代码0
注意,只要自定义的类继承自 Exception,则该类就是一个异常类,至于此类中包含的内容,并没有做任何规定。