在CTypes回调中捕获Python异常
我有一个在CTypes回调中捕获Python异常,python,ctypes,Python,Ctypes,我有一个ctypes回调函数,如下所示: def wrapper(ud, event): try: # ... except BaseException: wrapper.exc_info = sys.exc_info() return False HandlerCallback = PYFUNCTYPE(c_int, py_object, Event) cb = HandlerCallback(wrapper) # pass `
ctypes
回调函数,如下所示:
def wrapper(ud, event):
try:
# ...
except BaseException:
wrapper.exc_info = sys.exc_info()
return False
HandlerCallback = PYFUNCTYPE(c_int, py_object, Event)
cb = HandlerCallback(wrapper)
# pass `cb` to a C function
exc_info = getattr(wrapper, 'exc_info', None)
if exc_info:
six.reraise(*exc_info)
不幸的是,这并没有占据100%的可能案例。我遇到了一个KeyboardInteruppt
问题,它似乎是在调用C函数和调用wrapper()
之间出现的。不幸的是,回溯毫无帮助
是否可以让
PYFUNCTYPE
包装器捕获任何异常,而不是打印它们,然后将它们交还给我,这样我就可以在C函数调用后重新调用异常?回调是否在另一个线程上异步调用?如果是这种情况,它就不可能看到键盘中断
。Python只在其主线程上运行信号处理程序。它有一个C信号处理功能,在信号跳闸时设置标志。然后在主线程上调用处理程序,该处理程序可能会引发异常,也可能不会引发异常。对于SIGINT
,Python的信号.default\u int\u处理程序
会引发键盘中断
。