我有一个奇怪的问题。为了有一个简短的最小工作示例(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编译的二进制文件中,因此库差异不应该发挥作用)。
答案 0 :(得分:0)
也许您可以尝试from elasticsearch.exceptions import ConnectionError
并将NewConnectionError
替换为{{1}}。来自elasticsearch here