python捕获几个例外

时间:2014-07-16 22:29:24

标签: python exception exception-handling

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

我的问题是:列出可能生成的所有异常,或者只捕获一般异常是否更好?哪个更pythonic?

示例:

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

或者这个:

try:
    some_stuff()
except Exception as exc:
    loger.exception(exc)

4 个答案:

答案 0 :(得分:3)

你计划在主要代码中捕获异常,记录它并终止它是好的。

可能存在例外情况,这些情况很好而且并不意味着,您应将其视为问题,例如: KeyboardInterrupt

策略可能是:

  • 首先,抓住所有可能的例外情况,pass
  • 然后抓住一般Exception,记录并终止。

代码可能如下所示:

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并被遗忘 和程序终止。

这是一般用于捕获异常的明确且非常合理的用例。

答案 1 :(得分:2)

来自documentation

  

因为除了:捕获所有异常,包括SystemExit,   KeyboardInterrupt和GeneratorExit(这不是错误,应该   通常不会被用户代码捕获),使用裸露的除了:差不多   永远不是一个好主意。在你需要捕捉所有“正常”的情况下   错误,例如在运行回调的框架中,您可以捕获   所有正常异常的基类,异常。不幸的是在Python 2.x中它是
  第三方代码可能会引发不从Exception继承的异常,所以   在Python 2.x中,在某些情况下你可能不得不使用裸,除了:和手动>重新提出你不想抓住的例外。

一般来说,最好抓住明确的例外情况。在Python 2中,如果外部模块抛出不继承异常的内容,您如何执行此操作可能会导致仍然无法捕获的异常。

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

此外,你真的想要使用Ctrl + C来结束你的程序吗?

答案 2 :(得分:1)

在所有语言,时间和地点,最好指定特定的例外情况。这样你就不会掩盖你没想到的条件。永远不要在生产代码中捕获Exception,除非您有非常非常好的理由,或者您的处理程序是真正通用的。适当通用处理程序的一个示例是记录,执行清理和重新加载的处理程序。

答案 3 :(得分:1)

记下Tim Peter的书:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...

明确比隐含更好。写出可能的例外更加“pythonic”。

相关问题