如何在Python中处理ConnectionError

8ulbf1ek  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(120)

目前我有一个问题,我得到一个NameError为以下代码:

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

字符串
这不起作用,因为您必须从某个模块导入ConnectionError,这在文档中没有提到(也许我只是瞎了眼?)。我找到的都是this,但它引用了另一个请求库。

7rtdyuoh

7rtdyuoh1#

标准库中预期“普遍可用”的所有异常都是内置的,并在库参考的“内置异常”部分进行了记录。
在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.


同时,在将来,当您不知道需要处理哪种异常时,测试非常容易。首先,编写一些测试代码,通过记录异常类型的限定名来处理 any 异常。然后从日志中取出类型并在真实的代码中使用。

try:
    code_that_raises()
except Exception as e:
    print(type(e), type(e).__qualname__, whatever_else_looks_useful(e))

i7uaboj4

i7uaboj42#

我也遇到过类似的问题。我使用的是python 3.11,你使用的代码块没有导入,因为ConnectionError是python内置的。然而,例外并没有被抓住。
原来requests 2.31.0使用了自己的ConnectionError(!一旦我的except子句使用了requests.exceptions.ConnectionError,它就对我起作用了。

相关问题