为了弄清楚避免递归需要什么,我需要捕获任何异常(编辑:不仅仅是从异常派生的异常,而是所有异常,包括 KeyboardInterrupt 和用户异常),将其放入一个变量中,然后重新引发它在 catch 块之外。本质上,我正在尝试推出自己的 finally 块。这可能吗?

实际问题是调用多个清理函数,如果其中任何一个失败,也应该调用所有其他函数,那么失败的异常仍然应该传播。这是我当前的解决方案,它需要一个 Popen 对象列表:

def cleanupProcs(procs):
    if not procs:
        return

    proc = procs.pop(0)
    try:
        proc.terminate()
        proc.wait()
    finally:
        cleanupProcs(procs)

有没有迭代的方法来做到这一点?更优雅的方式?更Python化的方式?

最佳答案

如果您希望堆栈跟踪包括:

try:
    # something
except:
    the_type, the_value, the_traceback = sys.exc_info()
后来
raise the_type, the_value, the_traceback
(与 ojita 相关)
另请参阅 Python 2.7 的 this answer

关于Python:捕获任何异常并将其放入变量中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19405917/

10-16 12:40
查看更多