小编典典

如何在 Python 中使用自定义消息引发相同的异常?

all

我的代码中有这个try块:

try:
    do_something_that_might_raise_an_exception()
except ValueError as err:
    errmsg = 'My custom error message.'
    raise ValueError(errmsg)

严格来说,我实际上是在提高 另一个 ValueError,而不是ValueErrorthrow by
,在这种情况下do_something...()被称为。err如何将自定义消息附加到errerr我尝试以下代码,但由于ValueError
实例 不可调用而失败:

try:
    do_something_that_might_raise_an_exception()
except ValueError as err:
    errmsg = 'My custom error message.'
    raise err(errmsg)

阅读 69

收藏
2022-06-18

共1个答案

小编典典

更新: 对于 Python 3,请查看

如果你有幸只支持 python 3.x,这真的变成了一件美事:)

我们可以使用raise from链接异常。

try:
    1 / 0
except ZeroDivisionError as e:
    raise Exception('Smelly socks') from e

在这种情况下,您的调用者将捕获的异常具有我们引发异常的位置的行号。

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    1 / 0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise Exception('Smelly socks') from e
Exception: Smelly socks

请注意,底部异常仅具有我们引发异常的堆栈跟踪。您的调用者仍然可以通过访问__cause__他们捕获的异常的属性来获取原始异常。

with_traceback

或者您可以使用with_traceback

try:
    1 / 0
except ZeroDivisionError as e:
    raise Exception('Smelly socks').with_traceback(e.__traceback__)

使用这种形式,您的调用者将捕获的异常具有原始错误发生位置的回溯。

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    1 / 0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise Exception('Smelly socks').with_traceback(e.__traceback__)
  File "test.py", line 2, in <module>
    1 / 0
Exception: Smelly socks

请注意,底部异常具有我们执行无效除法的行以及我们重新引发异常的行。


将消息附加到当前异常并重新引发它:(外部 try/except 只是为了显示效果)

对于 x>=6 的 python 2.x:

try:
    try:
      raise ValueError  # something bad...
    except ValueError as err:
      err.message=err.message+" hello"
      raise              # re-raise current exception
except ValueError as e:
    print(" got error of type "+ str(type(e))+" with message " +e.message)

如果err派生 ,这也将做正确的事情ValueError。例如UnicodeDecodeError.

请注意,您可以添加任何您喜欢的内容err。例如err.problematic_array=[1,2,3].


编辑: @Ducan 在评论中指出上述不适用于 python 3,因为.message它不是ValueError.
相反,您可以使用它(有效的 python 2.6 或更高版本或 3.x):

try:
    try:
      raise ValueError
    except ValueError as err:
       if not err.args: 
           err.args=('',)
       err.args = err.args + ("hello",)
       raise 
except ValueError as e:
    print(" error was "+ str(type(e))+str(e.args))

编辑2:

根据目的,您还可以选择在自己的变量名下添加额外信息。对于 python2 和 python3:

try:
    try:
      raise ValueError
    except ValueError as err:
       err.extra_info = "hello"
       raise 
except ValueError as e:
    print(" error was "+ str(type(e))+str(e))
    if 'extra_info' in dir(e):
       print e.extra_info
2022-06-18