我在Python中遇到了一个非常奇怪的行为,这种行为不一致.
...
except IOError as msg:
sys.exit("###ERROR IOError: %s" % (msg))
通常这会给我一个消息,如:
###ERROR IOError: [Errno 13] Permission denied: 'filename'
在相同的情况下,上面的代码给了我一个元组而不是一个正确的错误消息.
###ERROR IOError: (13, 'Permission denied')
这很奇怪,因为在所有情况下异常都来自同一个python方法,codecs.open(…)
是什么让我想知道更多关于这一点,如果我删除处理异常将使用正确的文本(完整的错误消息)到达上层,总是!
except IOError as msg:
print(msg)
raise msg
以上示例将始终打印完整的消息,如IOError:[Errno 13]权限被拒绝:u’filename’.
为什么会发生这种情况,如何防止这种情况发生,我不想向用户提供不完整的错误消息.
我想在测试文件中重现此行为,但我无法在项目外重现此问题.
我怀疑这与sys.exit()的使用有关,因为print(msg)会产生良好的结果,但sys.exit没有.
解决方法:
首先,在重新引用异常时,除了Exc之外永远不要做e:raise e.它始终只是简单的加注,没有任何参数.这将保留回溯.
不,这与sys.exit无关,也与实例化异常的方式有关.你总是得到一个例外;有时它的字符串表示将类似于元组.
>>> print IOError(13, 'Permission denied')
[Errno 13] Permission denied
>>> print IOError((13, 'Permission denied'))
(13, 'Permission denied')
如果没有显示完整的回溯,就无法确定以这种方式引发错误的确切原因.而且,如果没有像我指出的那样适当地重新加注,你将无法获得完整的追溯.