我们如何通过未经处理的异常回溯退出脚本,遍历我们嵌套在其中的外部 try-catch 块中的每个 catch 语句?
假设我们定义以下函数:
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
现在,我们打个电话: 福((
我想要的是,让bar()
中的捕获语句杀死这个过程。
我们不希望foo()
赶上IndexError
,绝对不想打印'foo()' be handling error generated by list()[592]
。
如果我们用类似的东西替换### MAGIC GOES HERE ###
sys.exit(-20374290374)
,那么我们成功地杀死了进程,但没有回溯,也没有关于"未捕获"异常的信息。
我们如何才能像处理异常一样退出,而不首先通过所有外部尝试捕获块?
你提出了一些没有被捕获的东西:
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]')