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



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

目前为止,一切都好。碰巧的是,该库有一个"自定义"异常,也称为 ConnectionError:

class LibraryError(Exception):
    pass

class ConnectionError(LibraryError):
    pass

我想,如果我现在试图抓住一个ConnectionError,做一些类似的事情

try:
    do_something()
except ConnectionError as e:
    try_to_get_it_right_again()

我只会抓住从LibraryError继承而来的自定义ConnectionError。(免责声明:我不得不承认,我自己还没有测试过,因为我不知道怎么做)。

我如何让 Python 捕获内置ConnectionError

使用 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):
    ...

使用builtins库中定义的ConnectionError和其他异常:

import builtins
try:
    # connection error raised
except builtins.ConnectionError as conerr:
    # handle stuff

最新更新