2

我有一个我正在使用的模块,它有自己的例外。有没有办法在不明确说明异常的情况下捕获该模块中的所有异常?

所以假设我有一个名为的模块foo并且它有错误foo.a foo.b......foo.z 我该怎么做

try:
    method_from_foo() # throws a foo error
except any_foo_exception: # Can be any exception from the module foo
                          # if foo.a is thrown then it's caught here
                          # if foo.anything is thrown then it's caught here
    pass

而不是做

try:
    method_from_foo() # throws a foo error
except foo.a, foo.b, ... foo.z:
    pass

我不想做毯子Except,因为我想捕捉所有其他与不相关的异常foo

这可能吗?

4

2 回答 2

4

您通常通过为与您的模块相关的所有异常设置一个基本类型来执行此操作。所以如果你有一个FancyFooBar模块,你可能想创建一个FancyFooBarException

class FancyFooBarException (Exeption):
    pass

然后你可以创建你的异常AB...,并以此为基础:

class AException (FancyFooBarException):
    pass

class BException (FancyFooBarException):
    pass

# ...

这样,您抛出的所有异常都属于同一类型,即 FancyFooBarException,但仍具有更特定的类型以进行更特殊的区分。所以你可以这样做:

try:
    fancyfoobar.someMethod()
except fancyfoobar.AException:
    print('AException!')
except fancyfoobar.FancyFooBarException:
    print('One of the other exceptions')
except Exception:
    Print('Any other exception.. we do not really want to catch this though')
于 2013-11-07T23:57:44.020 回答
0

您可以为 foo 创建一个父异常,并让所有其他异常都继承自它。然后,在您的 try 语句中,测试父类:

In [126]: class parentException(Exception):
   .....:     def __init__(self):
   .....:         self.value = "Parent Exception"
   .....:     def __str__(self):
   .....:         return repr(self.value)
   .....:     

In [127]: class child1Exception(parentException):
   .....:     def __init__(self):
   .....:         self.value = "Child 1 Exception"
   .....:         

In [128]: class child2Exception(parentException):
   .....:     def __init__(self):
   .....:         self.value = "Child 2 Exception"
   .....:             

In [129]: try:
   .....:     raise child1Exception
   .....: except parentError:
   .....:     print "Caught child1"
   .....:     
Caught child1
于 2013-11-08T00:01:02.820 回答