我想修补一个库来捕获内置的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
?
答案 0 :(得分:3)
使用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):
...
答案 1 :(得分:2)
使用 ConnectionError
库中定义的 builtins
以及其他例外:
ExcelDNSA2.dll