[C++-sig] PyErr_ExceptionMatches not working?

Nat Goodspeed ngoodspeed at solidworks.com
Fri Jul 20 00:01:18 CEST 2007


________________________________________
From: c++-sig-bounces at python.org [mailto:c++-sig-bounces at python.org] On Behalf Of Lawrence Spector
Sent: Wednesday, July 18, 2007 3:11 PM
To: Development of Python/C++ integration
Subject: [C++-sig] PyErr_ExceptionMatches not working?

I have code that checks the following (snippet) when an exception is thrown...

if (PyErr_ExceptionMatches(PyExc_NameError))
{
 // do something...
}

It doesn't get into that block, yet, when I do this:

PyErr_Fetch(&errObj, &errData, &errTraceback);

std::cout << "Object error" << PyString_AsString(PyObject_Str(errObj));

I get:

Object error: <type 'exceptions.NameError'>

What gives?  Why isn't PyErr_ExceptionMatches saying that it's a NameError?  Does Boost.Python provide a better way to do exception handling than the Python API directly?

[Nat] I'm unaware of any Boost.Python enhancements to Python exception handling, though I think I remember seeing a mail message indicating interest among the developers.

Do you do your PyErr_Fetch() before your PyErr_ExceptionMatches()? Beware that fetching the Python exception clears the exception condition. Here's some code we use to print a Python exception without suppressing it:

catch (error_already_set&)
{
    PyObject *type, *value, *traceback;
    // Save the error state because PyErr_Print() is going to clear
    // it. That's not what we want.
    PyErr_Fetch(&type, &value, &traceback);
    // But whoops, PyErr_Fetch() just cleared the exception flag! If
    // we now call PyErr_Print(), it thinks there's nothing wrong, and
    // doesn't print anything! Immediately restore the exception so
    // PyErr_Print() will see it.
    PyErr_Restore(type, value, traceback);
    // Okay, print the traceback to stderr...
    PyErr_Print();
    // then restore (again!) the original exception state.
    PyErr_Restore(type, value, traceback);
    // Propagate the exception.
    throw;
}



More information about the Cplusplus-sig mailing list