我想修补一个库来捕获内置的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
模块,这是内置名称(如 int
和 ConnectionError
)所在的命名空间的显式名称。
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