在Python中引发先前实例化的异常是否可以?

问题描述 投票:0回答:1

我有一个异常类,我一直在用相同的消息提出。这就是我目前的结构......

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 exception
1个回答
3
投票

在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
    ...
© www.soinside.com 2019 - 2024. All rights reserved.