python捕捉到几个异常

2024-09-28 21:01:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码从多个函数调用多个方法。其中一些方法可能引发异常。每种方法都可能引发不同类型的异常。在我的主脚本中,我希望记录异常,然后退出。因此,不管异常类型是什么,都要记录并退出

我的问题是:列出所有可能生成的异常,还是只捕获一个通用异常更好?哪个更像Python?在

示例:

try:
    some_stuff()
except (Exc1, Exc2, Exc3) as exc:
    loger.exception(exc)

或者这个:

^{pr2}$

Tags: 方法代码脚本示例类型记录someexc
3条回答

您计划在主代码中捕捉异常,记录它并终止它,这是一个很好的计划。在

可能会有例外,这是很好的,但并不意味着,你应该把它们视为问题,例如KeyboardInterrupt

战略可以是:

  • 首先,捕获所有异常,您希望这些异常都很好,pass
  • 然后捕获generalException,记录并终止。在

代码可能看起来像:

try:
    some(stuff) # ...
# First, resolve expected exceptions
except KeyboardInterrupt:
    pass
# Finally, log unexpected ones
except Exception as exc:
    logger.exception(exc)
    return # time to terminate

什么时候捕捉异常显式失败

如果发生意外的异常,那么通过显式地捕捉所有预期的异常来改进的建议很短。您的计划是捕获日志文件中出现的任何内容,这听起来不错,并为以后解决问题提供了足够的信息。在

想象一下,你有一个守护进程,它会一直运行下去。在某些情况下,它可能会失败。在

如果只期望显式异常,则可能发生意外异常,不expect 将有机会将其记录到日志文件中,stacktrace将被打印到stdout并被遗忘 程序终止。在

这是一个很清楚而且非常合理的用例,可以用来捕捉异常。在

在所有语言、时间和地点,最好指定特定的异常。这样你就不会掩饰一个你没想到的情况。永远不要在生产代码中捕捉Exception,除非你有一个非常非常好的理由,或者你的处理程序是真正通用的。一个合适的泛型处理程序的例子是记录、执行清理和重新分级。在

documentation

Because except: catches all exceptions, including SystemExit, KeyboardInterrupt, and GeneratorExit (which is not an error and should not normally be caught by user code), using a bare except: is almost never a good idea. In situations where you need to catch all “normal” errors, such as in a framework that runs callbacks, you can catch the base class for all normal exceptions, Exception. Unfortunately in Python 2.x it is
possible for third-party code to raise exceptions that do not inherit from Exception, so in Python 2.x there are some cases where you may have to use a bare except: and manually > re-raise the exceptions you don’t want to catch.

一般来说,最好是捕获显式异常。在python2中,如果一个外部模块抛出了一个未继承异常的东西,那么您仍然无法捕捉到异常。在

通过捕捉显式异常,您可以处理您知道可能发生的错误。如果你包揽一切,你的应用程序可能会做一些意想不到的事情,你可能会错误地处理它。在

另外,你真的想抓住某人用Ctrl+C结束你的程序吗?在

相关问题 更多 >