当前,我遇到以下代码出现NameError
的问题:
try:
# some network programming raising an exception
except ConnectionError:
# some error handling
这是行不通的,因为您必须从某个模块中导入
ConnectionError
,而该模块在文档中没有提到(也许我只是盲目?)。我发现的只是this,但它引用了另一个请求库。
最佳答案
标准库中所有有望“普遍使用”的例外都是内置的,并记录在库参考的Built-in Exceptions部分中。
在3.3中,包括以下内容:
例外ConnectionError
连接相关问题的基类。
子类是BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
和ConnectionResetError
。
但这是内置的。所以这应该工作:
except ConnectionError:
在3.0-3.2中,没有
ConnectionError
这样的例外。 stdlib中的任何内容都不会引发该名称的任何东西。因此,尝试处理它毫无意义。 (有关OSError
和IOError
如何在3.2和3.3之间重新组织的说明,请参见PEP 3151。)ConnectionError
的3.2等效项是OSError
,具有某些errno
值。因此,您想要的是这样的:except OSError as e:
if e.errno not in (EPIPE, ESHUTDOWN, ECONNABORTED, ECONNREFUSED, ECONNRESET):
raise
# whatever you wanted to do for ConnectionError.
同时,将来,当您不知道需要处理哪种异常时,它很容易测试。首先,编写一些测试代码,通过记录异常类型的限定名称来处理任何异常。然后从日志中取出类型,并在实际代码中使用它。
try:
code_that_raises()
except Exception as e:
print(type(e), type(e).__qualname__, whatever_else_looks_useful(e))
关于python - 如何在Python中处理ConnectionError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19192891/