Bos*_*wow 26 python exception throw rethrow
我正在学习使用python.我刚刚看到这篇文章:http: //nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html 它描述了在python中重新抛出异常,如下所示:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Run Code Online (Sandbox Code Playgroud)
因为你重新抛出异常,所以shouold是一个"外部catch-except"语句.但现在,我在想.如果except中的do_something_to_apologize()抛出错误怎么办?哪一个将被捕获在外部"捕获 - 除外"?你重新抛出的那个还是do_something_to_apologize()抛出的那个?或者首先捕获具有最高暴力的例外情况?
Bre*_*arn 51
试试看,看看:
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
Run Code Online (Sandbox Code Playgroud)
结果:
Traceback (most recent call last):
File "<pyshell#14>", line 10, in <module>
apologize()
File "<pyshell#14>", line 5, in apologize
raise TypeError, "Apology error"
TypeError: Apology error
Run Code Online (Sandbox Code Playgroud)
原因是:原始功能的"真实"错误已被捕获except. 在达到之前apologize引发新错误.因此,子句中的子句永远不会执行,只有道歉的错误向上传播.如果引发错误,Python无法知道您之后会引发不同的异常.raiseraiseexceptapologizeapologize
请注意,在Python 3中,回溯将提及两个异常,并显示消息说明第二个出现的异常:
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 2, in failure
ValueError: Real error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./prog.py", line 11, in <module>
File "./prog.py", line 5, in apologize
TypeError: Apology error
Run Code Online (Sandbox Code Playgroud)
但是,第二个例外("道歉"例外)仍然是唯一一个向外传播并且可以被更高级别的except子句捕获的例外.回溯中提到了原始异常,但是在后一个异常中包含了异常,并且不再被捕获.
小智 7
将捕获do_something_to_apologize()抛出的异常.包含raise的行永远不会运行,因为do_something_to_apologize抛出了异常.另外,我不相信在python异常中有任何"优先级"的想法.
| 归档时间: |
|
| 查看次数: |
30749 次 |
| 最近记录: |