如何在Python中处理ConnectionError

如何在Python中处理ConnectionError,python,python-3.x,Python,Python 3.x,目前我遇到的问题是,对于以下代码,我得到了一个namererror: try: # some network programming raising an exception except ConnectionError: # some error handling 这不起作用,因为您必须从某个模块导入ConnectionError,文档中没有提到这一点(也许我只是瞎了眼?)。 我只找到了一个请求库,但它引用了另一个请求库。标准库中所有预期“一般可用”的异常都是内置的,并记录在

目前我遇到的问题是,对于以下代码,我得到了一个
namererror

try:
    # some network programming raising an exception
except ConnectionError:
    # some error handling
这不起作用,因为您必须从某个模块导入
ConnectionError
,文档中没有提到这一点(也许我只是瞎了眼?)。
我只找到了一个请求库,但它引用了另一个请求库。

标准库中所有预期“一般可用”的异常都是内置的,并记录在库参考部分中

在第3.3节中,这包括:

异常
ConnectionError

用于连接相关问题的基类

子类是
BrokenPipeError
ConnectionAbortedError
connectionreferesedror
ConnectionResetError

但这是一个内置的。因此,这应该是可行的:

except ConnectionError:

在3.0-3.2中,没有任何异常,如
ConnectionError
。stdlib中没有任何内容会引发该名称。因此,试图处理它是没有意义的。(有关如何在3.2和3.3之间重新组织
OSError
IOError
的说明,请参阅。)

ConnectionError
的3.2等效项是带有特定
errno
值的
OSError
。所以,你想要的是:

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))

看起来你在使用请求?我正在使用http.client.httpconnection您使用的Python版本是什么?从
http.client.HTTPConnection
显然是3.x。但是如果您在
ConnectionError
上遇到
namererror
,那么它不是3.2、3.3或3.4。抱歉,出于某种原因,我认为操作错误reorg在3.2中;实际上是3.3。让我编辑我的答案。但简短的版本是:您不会得到一个
ConnectionError
。你为什么认为这就是你想要处理的事情?@mafrasi2:换句话说,你的问题不是你在3.2文档中找不到
ConnectionError
,而是你读了一些3.3文档,或者一些为3.3编写的示例代码,或者其他不适用于3.2的东西,这让你陷入了一场白费力气的追逐。我正在运行python 3.2.3,但这也不起作用。我无法导入异常模块,如果不导入,我会得到另一个名称异常错误:(@mafrasi2:OK,已更新;3.2与3.1相同,与3.3不同。没有像
ConnectionError
这样的错误。哇,我不敢相信,这是真的,但你说得太对了。我从来没有得到过ConnectionError,那是socket.error