我有一些代码从多个函数调用多个方法。其中一些方法可能引发异常。每个都可以引发不同类型的异常。在我的主脚本中,我想记录异常,然后退出。因此,无论异常类型是什么,请记录并退出
我的问题是:列出可能生成的所有异常,或者只捕获一般异常是否更好?哪个更pythonic?
示例:
try:
some_stuff()
except (Exc1, Exc2, Exc3) as exc:
loger.exception(exc)
或者这个:
try:
some_stuff()
except Exception as exc:
loger.exception(exc)
答案 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)
因为除了:捕获所有异常,包括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”。