决定在Python中捕获哪些异常

时间:2011-06-01 10:42:42

标签: python exception-handling

假设我使用的库X指定exception.BaseErrorX的所有例外的基类。

现在,还有另一个例外,比如说X.FooError,它当然继承自exception.BaseError,但更通用,假设它处理无效输入。让我们假设还有许多其他类,从BaseError开始,但是对于一般情况都是如此。

 X
 |
BaseError
 |
FooError

所以我想检查无效输入。那么我应该抓住哪个例外?当然,捕获每个单独的异常是不可能的,所以我抓住X.BaseError然后打印错误消息。或者我可以专门捕获X.FooError,但我会错过所有其他错误情况。

这是标准的做法吗 - 捕获基本异常?如果是,那么为什么存在其他例外呢?对于我们想要捕获特定异常的一般情况?

3 个答案:

答案 0 :(得分:10)

仅捕获您可以处理的异常。如果您可以处理基本异常和派生异常,则捕获两者。但请确保首先放置派生的异常,因为第一个异常处理程序发现匹配是使用的。

try:
  X.foo()
except X.FooError:
  pass
except X.BaseError:
  pass

答案 1 :(得分:3)

像往常一样,PEP-8,Python Code样式指南:

提供了很好的建议
  

在捕获异常时,尽可能提及特定异常 ,而不是使用裸except:子句。

那里还有很多,但是我在这里复制它毫无意义。

在这种情况下,我会抓住具体细节,我是否需要以BaseError BaseError来处理那些需要更一般处理的细节。但是,我会停止捕捉内置的Exception

答案 2 :(得分:2)

通过在except子句中定义它来捕获特定异常,因此:

try:
    #do stuff
except X.FooError:
    # handle the error
except (X.AnotherError, x.YetAnotherError), exc:
    print 'I'm handling %s' % exc

请注意,您可以通过将它们列在元组中来处理多个异常类。