当前,我遇到以下代码出现NameError的问题:

try:
    # some network programming raising an exception
except ConnectionError:
    # some error handling


这是行不通的,因为您必须从某个模块中导入ConnectionError,而该模块在文档中没有提到(也许我只是盲目?)。
我发现的只是this,但它引用了另一个请求库。

最佳答案

标准库中所有有望“普遍使用”的例外都是内置的,并记录在库参考的Built-in Exceptions部分中。

在3.3中,包括以下内容:


  例外ConnectionError
  
  连接相关问题的基类。
  
  子类是BrokenPipeErrorConnectionAbortedErrorConnectionRefusedErrorConnectionResetError


但这是内置的。所以这应该工作:

except ConnectionError:




在3.0-3.2中,没有ConnectionError这样的例外。 stdlib中的任何内容都不会引发该名称的任何东西。因此,尝试处理它毫无意义。 (有关OSErrorIOError如何在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/

10-11 00:01