我们如何才能“提前”执行未处理的异常类型退出?

时间:2018-05-11 13:49:11

标签: python python-3.x exception exception-handling exit

我们如何使用未处理的异常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块,我们如何退出就像异常被处理一样?

1 个答案:

答案 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]')