捕获内置异常(而不是自定义)

时间:2016-01-22 19:29:55

标签: python class exception namespaces

我想修补一个库来捕获内置的ConnectionError(继承自OSError)。

到目前为止一切顺利。实际上,图书馆有一个自定义的"异常也称为ConnectionError:

k|7&12;  ==>  27|7&12  ==> 27|4  ==> 31  (discarded value)

fp=10/20;  ==>  fp=0    ==>  0   (fp is now 0.0)

fp=(float)10/20;  ==>  fp=10.0f/20 ==>   fp=0.5f   (fp is 0.5)

我想,如果我现在试图捕捉class LibraryError(Exception): pass class ConnectionError(LibraryError): pass ,那就像

那样
ConnectionError

我只会抓住自定义的try: do_something() except ConnectionError as e: try_to_get_it_right_again() ,它继承自ConnectionError。 (免责声明:我必须承认,我自己没有测试过,因为我不知道如何)。

我如何让Python捕获内置的LibraryError

2 个答案:

答案 0 :(得分:3)

使用builtins模块,即intConnectionError等内置名称所在的命名空间的显式名称。

import builtins

try:
    ...
except builtins.ConnectionError:
    ...

在Python 2中,这将是__builtin__,尽管Python 2没有ConnectionError。请注意__builtins__是它自己奇怪的事情;即使它看起来像你想要的,也不是。

如果你想要在Python 2和Python 3中运行的代码......那么,异常层次结构在Python 2中看起来很不一样,而ConnectionError甚至不存在,所以它并不那么简单决定是使用builtins还是__builtin__builtins / __builtin__事情很容易解决,至少。

要根据Python版本导入正确的模块,您可以捕获ImportError并导入其他模块:

try:
    import builtins
except ImportError:
    import __builtin__ as builtins

假装Python 2有ConnectionError,您可以在隐藏名称之前保存对内置ConnectionError的引用:

_builtin_ConnectionError = ConnectionError

class ConnectionError(LibraryError):
    ...

答案 1 :(得分:2)

使用 ConnectionError 库中定义的 builtins 以及其他例外:

ExcelDNSA2.dll