Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';PyThreadState_SetAsyncExc';原因';SystemError:exception exception()不是BaseException子类';_Python_Multithreading_Exception_Python C Api - Fatal编程技术网

Python ';PyThreadState_SetAsyncExc';原因';SystemError:exception exception()不是BaseException子类';

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

我正在用线程和钩子编写Python扩展模块。我需要将异常从我的一个线程抛出到Python主线程。对于此Im,请使用
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);