在创建自定义Exception类时,我遇到了一个意外情况如何基础 异常类处理参数。具体来说,它是如何设置'message'属性的。
将多个参数传递给Exception.__init__()
时,它不会初始化消息属性。例如,这可行
>>> e = Exception('msg')
>>> e.message
'msg'
但这不会设置消息属性
>>> e = Exception('msg', 'extra')
>>> e.message
''
它当然会将所有参数存储在args属性中:
>>> e = Exception('msg', 'extra')
>>> e.args
('msg', 'extra')
任何人都可以对此有所了解吗?我已经浏览了Exception文档,但我很难理解为什么Exception类会这样做。如果重要,那就是python 2.7
答案 0 :(得分:5)
使用source,Luke!
BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
{
if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
return -1;
Py_DECREF(self->args);
self->args = args;
Py_INCREF(self->args);
if (PyTuple_GET_SIZE(self->args) == 1) {
Py_CLEAR(self->message);
self->message = PyTuple_GET_ITEM(self->args, 0);
Py_INCREF(self->message);
}
return 0;
}
因此,仅当args为长度为1时才设置消息。
此行为的原因是为了向后兼容。自{python 2.6}以来Exception.message
为deprecated,而BaseException.__str__
的实现根本没有查看消息 - 它只使用了args元组。