Retrieving exception value in C

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Wed Dec 23 04:42:49 EST 2009


En Wed, 23 Dec 2009 04:24:04 -0300, swapnil <swapnil.st at gmail.com>  
escribió:

> I am trying to retrieve the value of the exception (the message part)
> raised in python, in C.
>
> But if I run (actually import) the script from within a C code
> (embedding python in C), I am able to get the exception object but not
> the value.
> The code looks like,
>
> int main()
> {
>     PyObject *exc, *val, *tbk, *module, *name;
>     PyObject *exc_str;
>     Py_Initialize();
>     name = PyString_FromString("myscript");
>     module = PyImport_Import(name);
>     Py_DECREF(name);
>     if(!module)
>     {
>         printf("error in running script\n");
>         if( PyErr_Occurred())
> 	{
> 		if(PyErr_ExceptionMatches(PyExc_Exception))
> 		{
> 			printf("exception received in C\n");
> 		}
> 		PyErr_Fetch(&exc, &val, &tbk);
>                 exc_str = PyObject_Str(exc);
> 		printf("exception received: %s\n", PyString_AsString(exc_str));
> 		printf("exception value: %s\n",PyString_AsString(val));
>                 Py_DECREF(exc_str);
>                 Py_DECREF(exc);
>                 Py_DECREF(val);
>                 Py_DECREF(tbk);
> 	}
> 	else{
> 		printf("no exception received in C\n");
> 	}
>
>     }
>     Py_XDECREF(module);
>     PyErr_Clear();
>     Py_Finalize();
>     return 0;
> }
>
> I get output,
>
> error in running script
> exception received in C
> exception received: <class 'shutil.Error'>
> exception value: (null)
>
> While the last line should be,
>
> exception value: `testfile` and `testfile` are the same file

PyErr_fetch retrieves the exception *type*, the exception *instance*, and  
the traceback. So in your code exc is shutil.Error (the class) and val is  
the specific instance raised.
The NULL comes from PyString_AsString(val) - it fails because val is not a  
string object.
In Python code you'd get the message using str(val) - that would be  
written PyObject_Str(val) in C.

-- 
Gabriel Genellina




More information about the Python-list mailing list