我的代码中有这个try块:
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如何将自定义消息附加到err?err我尝试以下代码,但由于ValueError 实例 不可调用而失败:
ValueError
do_something...()
err
try: do_something_that_might_raise_an_exception() except ValueError as err: errmsg = 'My custom error message.' raise err(errmsg)
更新: 对于 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__他们捕获的异常的属性来获取原始异常。
__cause__
或者您可以使用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.
UnicodeDecodeError
请注意,您可以添加任何您喜欢的内容err。例如err.problematic_array=[1,2,3].
err.problematic_array=[1,2,3]
编辑: @Ducan 在评论中指出上述不适用于 python 3,因为.message它不是ValueError. 相反,您可以使用它(有效的 python 2.6 或更高版本或 3.x):
.message
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