在Python中捕获一个通用异常可以吗?

在Python中捕获一个通用异常可以吗?,python,error-handling,subprocess,Python,Error Handling,Subprocess,我刚刚通读了关于捕捉一般异常的弊病 目前我正在用Python编写一个大型ish程序。此程序生成一些子进程(使用Popen),然后反复调用一些其他代码。作为一个大型程序,它有可能抛出各种异常类,其中许多我甚至还没有想到。这是一个问题,因为这意味着子进程没有正确终止 我想这样做: 保持运行时的信号() 尝试: 做那件事 例外情况除外,如e: kill_子进程() 引发异常(e) 然而,鉴于上述文章中关于捕获泛型异常的可怕警告,我对这样做有点紧张 我该如何继续?捕获异常意味着您准备好处理可能发生的某

我刚刚通读了关于捕捉一般异常的弊病

目前我正在用Python编写一个大型ish程序。此程序生成一些子进程(使用
Popen
),然后反复调用一些其他代码。作为一个大型程序,它有可能抛出各种异常类,其中许多我甚至还没有想到。这是一个问题,因为这意味着子进程没有正确终止

我想这样做:

保持运行时的信号()
尝试:
做那件事
例外情况除外,如e:
kill_子进程()
引发异常(e)
然而,鉴于上述文章中关于捕获泛型异常的可怕警告,我对这样做有点紧张


我该如何继续?

捕获异常意味着您准备好处理可能发生的某些类型的问题,并且您有一个计划,在发生这种情况时该怎么做。这通常应该尽可能的狭窄,所以你实际上只是在处理你已经准备好的特定问题,并且你有特定的补救措施

现在,如果您的代码非常广泛,那么进行广泛的错误处理也是有意义的。假设您正在编写一个类似Flask或Tornado的web框架。您将对用户提供的代码进行调用,您对这些代码没有任何影响,并且可能引发任何类型的错误。但是仅仅因为用户代码引发了一个错误,您不希望它影响web服务器。因此,您总是使用最广泛的异常处理程序将任何和所有调用封装到未知用户代码中,因为您的主要目标是保持服务器运行,而不管用户代码可能有什么问题


因此,是的,在适当的情况下使用通用异常处理程序是完全可以的。

如果您关心清理进程,但没有捕获所有可以尝试的内容。。。最后:

while keep_going_signal():
    try:
        do_the_thing()
    except SomePrettyLikelySpecificException e:
        handle_it()
    finally:
        if process_is_still_running():
            kill_subprocesses()
当然,您必须自己提供
进程仍在运行()

可能会出现一些异常(al)情况,这些异常会导致整个运行时的崩溃,在这种情况下,您的子流程可能无法保存

(编辑:本例捕获了我们认为可以处理的可预测异常类型。其他人指出了这一点的重要性和优点,以及重新抛出我们无法处理的异常类型的重要性和优点。)


捕获所有异常处理程序没有错,只要它捕获的异常不超过处理程序中的操作要处理的异常。异常处理程序中的操作旨在对所有错误执行清理,因此它证明了catch-all异常处理程序的合理性

这就是说,要在异常处理程序中重新引发异常,您应该使用
raise
语句,而不向其传递新的
exception
对象,以便在关联的回溯对象中保留调用堆栈,以便进行调试:

try:
    do_the_thing()
except Exception:
    kill_subprocesses()
    raise

处理你所知道和预期的错误。明确地抓住他们。如果出现其他错误,您可以更新您的代码和测试用例,以确保其被捕获并得到适当处理。在本例中,IMO没有问题。异常警察不会来逮捕您……尽管您捕获了所有异常,但您并没有压制或忽略它们。确保进程已停止,然后重新引发异常,以防其他任何人可以采取措施进行恢复。这绝对好。