Im writing Python extension module with threads and hookers. I need to throw exception from one of my threads to main Python thread. For this Im using int PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
. In the documentation sayd:
exc
is the exception object to be raised
Nothing easier. But when I call PyThreadState_SetAsyncExc
with Exception
(actually PyExc_Exception
) instance as exc
, I get
SystemError: exception Exception('Error text') not a BaseException subclass
I can read:), so I tried put not a class instance (as stated in docs, I believe), but class object directly as exc
and it worsk. But, as a result, I cannot pass arguments to it.
This code causes system error in main thread:
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyObject_CallObject(PyExc_Exception, Py_BuildValue("(s)", "Error text")));
PyGILState_Release(gstate);
This code causes expected Exception
in main thread:
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyExc_Exception);
PyGILState_Release(gstate);
Full error text, IDLE shows:
Traceback (most recent call last):
** IDLE Internal Exception:
File "C:\Python37-32\lib\idlelib\run.py", line 137, in main
request = rpc.request_queue.get(block=True, timeout=0.05)
File "C:\Python37-32\lib\queue.py", line 179, in get
self.not_empty.wait(remaining)
File "C:\Python37-32\lib\threading.py", line 300, in wait
gotit = waiter.acquire(True, timeout)
SystemError: exception Exception('Error text') not a BaseException subclass
So, I expected PyThreadState_SetAsyncExc
supports exception instance-objects, but it looks like it supports only class/type-objects.
Am I correct? Or maybe I do it wrong?