猿问

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


我刚刚阅读了Real Python的这篇文章,关于捕获通用异常的弊端。


我目前正在Python中开发一个大型程序。该程序生成一些子进程(使用),然后一遍又一遍地调用一些其他代码。作为一个大型程序,它有可能引发各种异常类,其中许多我甚至还没有想到。这是一个问题,因为这意味着子进程没有被正确杀死。Popen


我想做这样的事情:


while keep_going_signal():

    try:

        do_the_thing()

    except Exception as e:

        kill_subprocesses()

        raise Exception(e)

但是,鉴于上述文章中关于捕获通用异常的可怕警告,我对这样做有点紧张。


我应该如何继续?


慕桂英4014372
浏览 113回答 3
3回答

蝴蝶刀刀

捕获所有异常处理程序没有错,只要它捕获的异常多于处理程序中的操作要处理的异常。异常处理程序中的操作旨在对所有错误执行清理,因此它证明了捕获所有异常处理程序的合理性。也就是说,要在异常处理程序中重新引发异常,您应该改用该语句而不向其传递新对象,以便将调用堆栈保留在关联的回溯对象中以进行调试:raiseExceptiontry:    do_the_thing()except Exception:    kill_subprocesses()    raise

收到一只叮咚

如果您担心清洁过程但无法捕获所有可能的内容:try... finallywhile keep_going_signal():    try:        do_the_thing()    except SomePrettyLikelySpecificException e:        handle_it()    finally:        if process_is_still_running():            kill_subprocesses()当然,你必须自己供应。process_is_still_running()可能会有一些异常(al)情况,它们会降低整个运行时,在这种情况下,您的子进程可能无法保存。(编辑:此示例捕获了我们认为可以处理的可预测异常类型。其他人指出了这一点的意义和优点,以及重新抛出我们无法处理的那些。https://docs.python.org/3/tutorial/errors.html

小怪兽爱吃肉

捕获异常意味着您已准备好处理可能发生的某些类型的问题,并且您有一个计划,当发生这种情况时该怎么办。这通常应该尽可能狭窄,所以你实际上只处理你准备的特定问题,以及你有特定的补救措施。现在,如果你的代码非常广泛,那么进行广泛的错误处理也是有意义的。假设你正在编写一个像Flask或Tornado这样的Web框架。您将调用用户提供的代码,对此您的影响为零,并且可能会引发任何类型的错误。但是,仅仅因为用户代码引发了错误,您不希望它影响Web服务器。因此,您始终使用尽可能广泛的异常处理程序将任何和所有调用封装到未知用户代码中,因为您的主要目标是保持服务器运行,而不管用户代码可能存在什么问题。因此,是的,在适当的情况下使用通用异常处理程序是完全可以的。
随时随地看视频慕课网APP

相关分类

Python
我要回答