我们如何使用未处理的异常trace-back退出脚本,遍历我们嵌套在其中的外部try-catch块中的每个catch-statement?
假设我们定义了以下函数:
import sys
def foo():
try:
bar()
list()[592]
except IndexError:
print('`foo()` be handling error generated by list()[592]')
return
def bar():
try:
list()[345]
except IndexError:
pass
### MAGIC GOES HERE ###
return
现在,我们打电话: FOO()
我想要的是bar()
中的catch语句来杀死进程。
我们不希望foo()
抓住IndexError
,而且 肯定要打印'foo()' be handling error generated by list()[592]
。
如果我们用### MAGIC GOES HERE ###
之类的内容替换sys.exit(-20374290374)
,那么我们就会成功终止进程,但是没有回溯,也没有关于“未被捕获”异常的信息。
如果没有首先遍历所有外部try-catch块,我们如何退出就像异常被处理一样?
答案 0 :(得分:1)
你提出了一些没有抓到的东西:
import sys
class MyException(Exception):
pass
def foo():
try:
bar()
list()[592]
except IndexError:
print('`foo()` be handling error generated by list()[592]')
return
def bar():
try:
list()[345]
except IndexError:
raise MyException("step out")
return
foo()
输出:
Traceback (most recent call last):
File "main.py", line 26, in <module>
foo()
File "main.py", line 10, in foo
bar()
File "main.py", line 21, in bar
raise MyException("step out")
__main__.MyException: step out
如果您在某个地方抓住基地Exception
( - 您不应该 - ),您需要检查您的特殊种类并重新加注:
except Exception as e:
if isinstance(e,MyException):
raise # e not needed, raise rethrows last one
print('`foo()` be handling error generated by list()[592]')