hi,

I'm using boost::python for calling some python code and when the
exception is thrown I want to get type, value and traceback of it.

The problem is with traceback: I got only *one* frame (the first one)

// this always returns Py_None
tb_frame = PyObject_GetAttrString(tb_frame, "f_back");

What I'm doing wrong?

void
Deployer::showError() {
//    PyErr_Print();

    PyObject *exc_type, *exc_value, *exc_traceback, *pystring;

    PyErr_Fetch(&exc_type, &exc_value, &exc_traceback);

    // type works
    pystring = PyObject_Str(exc_type);
    char *type = QString(python::extract<char*>(pystring));
    Py_XDECREF(pystring);

    // value works
    pystring = PyObject_Str(exc_value);
    char *value = QString(python::extract<char*>(pystring));
    Py_XDECREF(pystring);

    // traceback does't work ;(
    PyObject *tb_frame = PyObject_GetAttrString(exc_traceback, "tb_frame");
    while (tb_frame != Py_None) {
        PyObject *f_lineno = PyObject_GetAttrString(tb_frame, "f_lineno");
        int lineno = python::extract<int>(f_lineno);
        Py_XDECREF(f_lineno);

        PyObject *f_code = PyObject_GetAttrString(tb_frame, "f_code");
        PyObject *co_filename = PyObject_GetAttrString(f_code,
"co_filename");
        char *filename = python::extract<char*>(co_filename);
        Py_XDECREF(f_code);
        Py_XDECREF(co_filename);

        PyObject *tmp = tb_frame;
//        PyObject_Print(tb_frame, stderr, Py_PRINT_RAW);
//        fprintf(stderr, "\n");
        tb_frame = PyObject_GetAttrString(tb_frame, "f_back");
//        PyObject_Print(tb_frame, stderr, Py_PRINT_RAW);
//        fprintf(stderr, "\n");
        Py_XDECREF(tmp);
    }

    Py_XDECREF(exc_type);
    Py_XDECREF(exc_value);
    Py_XDECREF(exc_traceback);
}


thanks,
Skink
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to