How to catch a usefull error message ?

MRAB python at mrabarnett.plus.com
Tue Apr 23 15:48:55 EDT 2019


On 2019-04-23 19:21, Vincent Vande Vyvre wrote:
> Le 23/04/19 à 19:23, Chris Angelico a écrit :
>> On Wed, Apr 24, 2019 at 3:18 AM Vincent Vande Vyvre
>> <vincent.vande.vyvre at telenet.be> wrote:
>>> Hi,
>>>
>>> In a CPython lib I have an _init() method wich take one argument, a file
>>> name.
>>>
>>>       char *fname;
>>>
>>>       if (!PyArg_ParseTuple(args, "s", &fname))
>>>           return NULL;
>>>
>>> So, if I instanciate my object with a bad argument I've a good error
>>> message:
>>>
>>> tif = ImgProc(123)
>>> TypeError: argument 1 must be str, not int
>>> (followed by the traceback)
>>>
>>> But if I do:
>>> try:
>>>       tif = ImgProc(123)
>>> except Exception as why:
>>>       print("Error:", why)
>>>
>>> I get just:
>>>
>>> Error: <class '_liboqapy.ImgProc'> returned a result with an error set
>>>
>> It looks like there's an internal problem in the C function. Are you
>> sure it's hitting the PyArg_ParseTuple and then immediately returning
>> NULL? Post a bit more of your code; this error looks like something is
>> leaving an error state but then carrying on with the code.
>>
>> ChrisA
> 
> Into the lib:
> 
> static int
> ImgProc_init(ImgProc *self, PyObject *args, PyObject *kwds)
> {
>       PyObject *tmp;
>       char *fname;
> 
>       if (!PyArg_ParseTuple(args, "s", &fname))
>           return NULL;
> 
>       tmp = self->src;
>       self->src = PyUnicode_FromString(fname);
>       Py_XDECREF(tmp);
>       return 0;
> }
> 
[snip]

That function returns an int.

If PyArg_ParseTuple fails, your function returns NULL, which is cast to 
an int, 0.

If PyArg_ParseTuple succeeds, your function returns 0.

Either way, it returns 0.

So how does the caller know whether the function was successful? Does it 
check PyErr_Occurred?


More information about the Python-list mailing list