PyThreadState_SetAsyncExc' causes 'SystemError: exception Exception() not a BaseException subclass'

General Tech Bugs & Fixes 2 years ago

0 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

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?

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.