为什么在异常消息中附加信息不起作用?

wim*_*wim 6 python exception

为什么这不起作用?

try:
    1/0
except ZeroDivisionError as e:
    e.message += ', you fool!'
    raise
Run Code Online (Sandbox Code Playgroud)

即使它仍在异常实例上,也不会使用修改后的消息.上面有一个工作模式吗?行为应该像我目前的解决方法如下:

try:
    1/0
except ZeroDivisionError as e:
    args = e.args
    if not args:
        arg0 = ''
    else:
        arg0 = args[0]
    arg0 += ', you fool!'
    e.args = (arg0,) + args[1:]
    raise
Run Code Online (Sandbox Code Playgroud)

我知道python3中的异常链接,它看起来不错但很遗憾在python2中不起作用.那么在python2中重新引发异常的常用方法是什么?

注意:由于此处提到的警告和警告,我不想挖掘回溯并创建新的异常,而是重新引发现有的异常实例.

dan*_*ano 4

改变e.args是做到这一点的唯一方法。for 的实现BaseException.__str__只考虑args元组,根本不考虑message

static PyObject * 
BaseException_str(PyBaseExceptionObject *self)
{
    PyObject *out;

    switch (PyTuple_GET_SIZE(self->args)) { 
    case 0:
        out = PyString_FromString("");
        break;
    case 1:
        out = PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
        break;
    default:
        out = PyObject_Str(self->args);
        break;
    } 

    return out;
}
Run Code Online (Sandbox Code Playgroud)

这应该不会太意外,因为自 Python 2.6 以来BaseException.message已弃用。