How to catch a usefull error message ?

Vincent Vande Vyvre vincent.vande.vyvre at telenet.be
Tue Apr 23 15:21:52 EDT 2019


Le 23/04/19 à 20:54, Chris Angelico a écrit :
> On Wed, Apr 24, 2019 at 4:47 AM Vincent Vande Vyvre
> <vincent.vande.vyvre at telenet.be> wrote:
>
> 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;
> }
>
> If i do:
>       try:
>           tif = ImgProc(123)
>       except Exception as why:
>           print(sys.exc_info())
>           raise
> I get:
> (<class 'SystemError'>, SystemError("<class '_liboqapy.ImgProc'>
> returned a result with an error set",), <traceback object at
> 0x7f3bcac748c8>)
> TypeError: argument 1 must be str, not int
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>     File "/home/vincent/oqapy-3/trunk/filters/ui_lenscorrection.py", line
> 104, in on_main_cursor_changed
>       self.prepare_preview_process()
>     File "/home/vincent/oqapy-3/trunk/filters/ui_lenscorrection.py", line
> 137, in prepare_preview_process
>       self.main.process_on_preview(params)
>     File "/home/vincent/oqapy-3/trunk/filters/lenscorrection.py", line
> 56, in process_on_preview
>       tif = ImgProc(123)
> SystemError: <class '_liboqapy.ImgProc'> returned a result with an error set
> --------------------------------------------------------------------------------
> Why a SystemError ?
> The SystemError means that you're using the Python C API in a way that
> doesn't make sense to the interpreter. You're leaving a marker saying
> "hey, I need you to throw an exception" but then you're also returning
> a value. You'll need to figure out where that's happening and exactly
> what is being called. How are you setting up your class?
>
> ChrisA

The syntaxe

     if (!PyArg_ParseTuple(args, "s", &fname))
          return NULL;

Is the usage described in the doc [*]

And without block try-except I get the good one error.


[*] 
https://docs.python.org/3.5//extending/extending.html#back-to-the-example


Vincent




More information about the Python-list mailing list