我有一个异常类,我一直在用相同的消息提出。这就是我目前的结构......
class MyException(Exception):
UNAUTHORIZED = 'UNAUTHORIZED'
SOME_OTHER_EXCEPTION = 'SOME_OTHER_EXCEPTION'
SOME_OTHER_THING = 'SOME_OTHER_THING'
# ...
def func():
# ...
raise MyException(MyException.UNAUTHORIZED)
这是非常不科学的。我想知道我是否可以做这样的事情......
class MyException(Exception):
UNAUTHORIZED = MyException('UNAUTHORIZED')
SOME_OTHER_EXCEPTION = MyException('SOME_OTHER_EXCEPTION')
SOME_OTHER_THING = MyException('SOME_OTHER_THING')
# ...
def func():
# ...
raise MyException.UNAUTHORIZED
......看起来更干净。
我想知道这样做是否可以......实例化异常是否有任何重要性?
或者我是不正确地接近这整件事?我应该这样做吗?
class MyException(Exception):
pass
class UnauthorizedException(MyException):
def __init__(self):
super(UnauthorizedException, self).__init__('UNAUTHORIZED')
def func():
# ...
raise UnauthorizedException()
(在这种情况下,我有大约10种不同的自定义异常类,我认为这有点多,这就是为什么我倾向于我之前的想法。)
在Python 3中,异常具有存储相应回溯的__traceback__
属性。如果你在任何地方重复使用相同的异常对象,那将会覆盖__traceback__
并使用traceback检查。
此外,重用异常也会混乱异常链接:__context__
和__cause__
。您可能会将错误的异常报告为重用异常的上下文或原因。
不要重用异常对象。而不是raise MyException(MyException.UNAUTHORIZED)
或raise MyException.UNAUTHORIZED
,你应该使用子类。这样做要容易得多
except UnauthorizedException:
...
比它要做的
except MyException as e:
if e.args != (MyException.UNAUTHORIZED,):
raise
...