python异常中的意外参数处理

python异常中的意外参数处理,python,exception-handling,Python,Exception Handling,在创建自定义异常类时,我遇到了一个意外情况 异常类处理参数。具体来说,它是如何设置“message”属性的 当您向异常传递多个参数时。\uuu init\uuu(),它不会初始化消息属性。例如,这是有效的 >>> e = Exception('msg') >>> e.message 'msg' 但这没有设置消息属性 >>> e = Exception('msg', 'extra') >>> e.message '' 它当

在创建自定义异常类时,我遇到了一个意外情况 异常类处理参数。具体来说,它是如何设置“message”属性的

当您向
异常传递多个参数时。\uuu init\uuu()
,它不会初始化消息属性。例如,这是有效的

>>> e = Exception('msg')
>>> e.message
'msg'
但这没有设置消息属性

>>> e = Exception('msg', 'extra')
>>> e.message
''
它当然会将所有参数存储在args属性中:

>>> e = Exception('msg', 'extra')
>>> e.args
('msg', 'extra')
有人能解释一下吗?我已经浏览了异常文档,但是我不知道为什么异常类会这样做。如果重要的话,这是Python2.7

使用,Luke

因此,仅当args的长度为1时才设置消息


这种行为的原因是为了向后兼容<代码>异常。消息是从python 2.6开始的,而
BaseException的实现根本不看消息-它只使用args元组。

感谢代码,但我很好奇为什么会出现这种行为?谢谢……我会接受这一正确答案(需要等待6分钟,以便允许这样做)。您是否引用了不推荐使用的语句?我想读一读,看。
message
属性实际上是对
BaseException
类的短暂添加,在2.5中添加,但在2.6中立即被弃用。
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;
}