不要抓住一切

虽然通常很容易捕捉每一个节目:

try:
    very_difficult_function()
except Exception:
    # log / try to reconnect / exit gratiously
finally:
    print "The END"
    # it runs no matter what execute.

甚至一切(包括 BaseException 及其所有孩子,包括 Exception):

try:
    even_more_difficult_function()
except:
    pass  # do whatever needed

在大多数情况下,这是不好的做法。它可能会捕获超过预期的内容,例如 SystemExitKeyboardInterruptMemoryError–每个应该通常以不同于通常的系统或逻辑错误的方式处理。这也意味着对内部代码可能出错的内容以及如何从该条件中正确恢复没有明确的理解。如果你捕获每个错误,你将不会知道发生了什么错误或如何解决它。

这通常被称为“bug 掩蔽”,应该避免。让你的程序崩溃,而不是默默地失败,甚至更糟,在更深层次的执行失败。 (想象一下,这是一个交易系统)

通常这些构造在程序的最外层使用,并将记录错误的详细信息,以便可以修复错误,或者可以更具体地处理错误。