为什么我在Python上得到不一致的异常?

我在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')

如果没有显示完整的回溯,就无法确定以这种方式引发错误的确切原因.而且,如果没有像我指出的那样适当地重新加注,你将无法获得完整的追溯.

上一篇:python – IOError:[Errno 2]没有这样的文件或目录


下一篇:KVM+bond0搭建使用KVM虚拟机