Python ';PyThreadState_SetAsyncExc';原因';SystemError:exception exception()不是BaseException子类';
我正在用线程和钩子编写Python扩展模块。我需要将异常从我的一个线程抛出到Python主线程。对于此Im,请使用Python ';PyThreadState_SetAsyncExc';原因';SystemError:exception exception()不是BaseException子类';,python,multithreading,exception,python-c-api,Python,Multithreading,Exception,Python C Api,我正在用线程和钩子编写Python扩展模块。我需要将异常从我的一个线程抛出到Python主线程。对于此Im,请使用int-PyThreadState\u setasyncex(无符号长id,PyObject*exc)。在文件中说: exc是要引发的异常对象 没有比这更容易的了。但是当我调用带有异常的PyThreadState\u setasyncec(实际上是PyExc\u Exception)实例作为exc)时,我得到 SystemError:exception exception('Erro
int-PyThreadState\u setasyncex(无符号长id,PyObject*exc)
。在文件中说:
exc
是要引发的异常对象
没有比这更容易的了。但是当我调用带有异常的PyThreadState\u setasyncec
(实际上是PyExc\u Exception
)实例作为exc
)时,我得到
SystemError:exception exception('Error text')不是BaseException子类
我可以读:),所以我试着不放类实例(如文档中所述,我相信),而是直接将类对象放为exc
,然后它运行。但是,因此,我无法向它传递参数
此代码导致主线程中出现系统错误:
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyObject_CallObject(PyExc_Exception, Py_BuildValue("(s)", "Error text")));
PyGILState_Release(gstate);
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyExc_Exception);
PyGILState_Release(gstate);
此代码导致主线程中出现预期的异常
:
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyObject_CallObject(PyExc_Exception, Py_BuildValue("(s)", "Error text")));
PyGILState_Release(gstate);
PyGILState_STATE gstate = PyGILState_Ensure();
PyThreadState_SetAsyncExc(self->main_thread_id, PyExc_Exception);
PyGILState_Release(gstate);
完整错误文本,空闲显示:
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
因此,我希望PyThreadState\u setasyncex
支持异常实例对象,但它似乎只支持类/类型对象。
我说得对吗?或者我做错了?是的,你是对的。您需要指定异常类型,而不是实例。文档可能会更清楚地说明这一点 如果要提供带有异常的自定义错误消息,可以使用
PyErr\u NewException
函数创建自己的异常类型:
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject* exc = PyErr_NewException("mymodule.MyError: error message", NULL, NULL);
PyThreadState_SetAsyncExc(self->main_thread_id, exc);
Py_DECREF(exc);
PyGILState_Release(gstate);