urllib3.exceptions.NewConnectionError 错误在一台机器上处理但不在另一台机器上

Posted

技术标签:

【中文标题】urllib3.exceptions.NewConnectionError 错误在一台机器上处理但不在另一台机器上【英文标题】:urllib3.exceptions.NewConnectionError error handled on one machine but not on another 【发布时间】:2016-02-19 07:42:24 【问题描述】:

我有一个奇怪的问题。为了有一个简短的最小工作示例 (MWE),我们假设 Connect() 返回一个 urllib3.connection.HTTPConnection 对象。我们还假设如果在错误消息中找到'magicword'(不是实际单词,但嘿,这是一个 MWE),我想忽略一些其他异常冒泡。

MWE:

try:
    conn_obj = Connect()
except Exception as e:  # there are some other exceptions I want to ignore
    if 'magicword' not in e.message:
        print 'fatal error: '.format(e.message)

这在我的机器上运行良好,遇到时会打印“致命错误”并忽略其他异常(在这种情况下应该如此)。

但是,在同事的机器上,错误没有得到处理,而是崩溃并创建了回溯。这是我机器上的完全相同的错误,只是他不会打印和崩溃而不是被处理。我们都使用完全相同的操作系统(Windows 7)。

显然不处理特定异常并不理想,因此我尝试了该路线:

from urllib3.exceptions import NewConnectionError

try:
    conn_obj = Connect()
except NewConnectionError as nce:
    print 'fatal error: '.format(e.message)
except Exception as e:  # there are some other exceptions I want to ignore
    if 'magicword' not in e.message:
        print 'fatal error: '.format(e.message)

那也没用。由于某种原因,它不会在他的盒子上捕捉到异常。为什么异常可以在我的机器上处理,而不是在他的机器上?

更新:

连接对象是在 pyelasticsearch 第三方库中提出的。我一直都能很好地捕捉到它,但在其他机器上使用相同的代码并没有捕捉到它。这是我编写的一个文件,用于测试在显式引发时是否捕获了错误:

from urllib3.exceptions import NewConnectionError

def error_test(test_num):
    print '\n\n'
    try:
        if test_num == 1:
            print 'TEST 1: See if NewConnectionError is caught specifically'
            raise NewConnectionError('no pool', 'test one')
        elif test_num == 2:
            print 'TEST 2: See if RuntimeError is caught related to magicword'
            raise RuntimeError('test two magicword catching test')
        elif test_num == 3:
            print 'TEST 3: See if RuntimeError is caught NOT related to magicword'
            raise RuntimeError('test three')
    except NewConnectionError as nce:
        print 'Test 1 passed successfully.\n\n'.format(nce.message)
    except Exception as e:
        if 'magicword' not in e.message:
            print 'Test 3 passed successfully.\n\n'.format(e.message)
        else:
            print 'Test 2 passed successfully.\n\n'.format(e.message)

error_test(1)
error_test(2)
error_test(3)

这项测试在我们的两台机器上都运行良好。所以不知何故,通过让第三方库参与进来,我们的机器之间会出现一些不一致的情况(这实际上是在 pyinstaller 编译的二进制文件中,所以库差异不应该发挥作用)。

【问题讨论】:

你能提供你处理过的前任和同事的追溯吗?您是否尝试过打印 e.message,捕获 BaseException...? @kAlmAcetA 当我调试它时,我们俩的回溯是相同的,只有我可以捕获并处理异常,但他永远不会被捕获。我们都在运行相同的代码。 消除特定于 lib 的代码运行显式 try: raise NewConnectionError('no pool', 'my magicword'); except Exception...。或者更简单的Exception 带有消息。有用吗? @kAlmAcetA 抱歉耽搁了,我必须与同事合作并编写一个简短的脚本,看看它是否发现了这些错误。它做了。当我明确提出错误并处理它时,它们在两台机器上都得到了很好的处理。该错误是通过 pyelasticsearch 库引发的,但是冒泡的异常是在我的机器上处理的,而不是在他的机器上。看起来我有很多事情要做。 @kAlmAcetA 我添加了我的测试代码。 【参考方案1】:

也许您可以尝试from elasticsearch.exceptions import ConnectionError 并用它替换您的NewConnectionError。来自elasticsearch的文档here

【讨论】:

以上是关于urllib3.exceptions.NewConnectionError 错误在一台机器上处理但不在另一台机器上的主要内容,如果未能解决你的问题,请参考以下文章