python Exceptions中意外的参数处理

时间:2014-11-06 13:19:08

标签: python exception-handling

在创建自定义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

1 个答案:

答案 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.messagedeprecated,而BaseException.__str__的实现根本没有查看消息 - 它只使用了args元组。