2011-06-01 47 views
7

假设我正在使用库X,该库指定例如exception.BaseErrorX的所有例外的基类。确定要在Python中捕获哪些例外

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

X 
| 
BaseError 
| 
FooError 

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

这是做到这一点的标准方式 - 捕捉基本异常?如果是,那么为什么还存在其他例外情况?对于我们想要捕捉特定异常的广义情况?

回答

10

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

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

但是为什么抓住派生的一个,当基地可以处理一切? – user225312 2011-06-01 10:50:34

+0

因为您可能想要以与基本异常不同的方式处理派生异常。 – 2011-06-01 10:52:19

+1

但是,如果我不想以不同的方式处理特定异常,那么是否使用基本异常类呢? – user225312 2011-06-01 10:53:24

3

像往常一样,在PEP-8很好的意见,风格指南Python代码:

当捕捉异常,具体例外尽可能而是采用了裸except:条款。

这里还有很多东西,但在这里再现它没有意义。

在这种情况下,我会赶上的细节,都被我以不同的方式处理它们的BaseErrorBaseError对于那些需要更多的一般处理。但是,我会停下来抓住内置的Exception

+0

请注意,我从来没有说过一个“except”条款。我询问了捕获基类“BaseError”与更一般化的“FooError”之间的区别。 – user225312 2011-06-01 10:50:14

+0

@A A:我在编辑的过程中当你评论:-) – Johnsyweb 2011-06-01 10:52:57

2

您可以通过定义它的except子句中,从而搭上specfic例外:

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

通知您可以通过在一个元组中列出这些处理多个异常类。

+0

感谢您的回答,请在Ignacio的回答中看到我的评论。 – user225312 2011-06-01 10:50:56

+0

@A A:没问题; @Ignacio打败了我 – 2011-06-01 11:10:26