自定义异常类应该总是继承自内置的 Exception
类, 或者是继承自那些本身就是从 Exception
继承而来的类。 尽管所有类同时也继承自 BaseException
,但你不应该使用这个基类来定义新的异常。BaseException
是为系统退出异常而保留的,比如 KeyboardInterrupt
或 SystemExit
以及其他那些会给应用发送信号而退出的异常。 因此,捕获这些异常本身没什么意义。 这样的话,假如你继承 BaseException
可能会导致你的自定义异常不会被捕获而直接发送信号退出程序运行。
例一:
# 自定义异常 # 自定义异常能让异常更精准 # 自定义异常类:当list内元素长度超过10的时候抛出异常 # 自定义异常类:消息小于8的时候抛出异常
class lenError(Exception):
def __init__(self,msg):
self.msg = msg
def __str__(self):
return self.msg
lst = [1,2,3,4,5,6,7]
try :
if not 8 <= len(lst) <= 10:
raise lenError("长度不在8到10 之间")
except lenError as er:
print(er)
例二:
自定义异常 需要继承Exception
class MyException(Exception):
def __init__(self, *args):
self.args = args
#raise MyException('爆出异常吧哈哈')
#常见做法定义异常基类,然后在派生不同类型的异常
class loginError(MyException):
def __init__(self, code = 100, message = '登录异常', args = ('登录异常',)):
self.args = args
self.message = message
self.code = code
class loginoutError(MyException):
def __init__(self):
self.args = ('退出异常',)
self.message = '退出异常'
self.code = 200
#raise loginError() # 这里突然返现 raise引发的异常将中断程序
#
try:
raise loginError()
except loginError as e:
print(e) #输出异常
print(e.code) #输出错误代码
print(e.message)#输出错误信息
.如何手动抛出异常:raise
系统的自带的异常只要触发会自动抛出,比如NameError,但用户自定义的异常需要用户自己决定什么时候抛出。 raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。大多数的异常的名字都以"Error"结尾,所以实际命名时尽量跟标准的异常命名一样。