我正在为Windows扩展python2.7.5应用程序。应用程序使用^{
@ctypes.WINFUNCTYPE(ctypes.wintypes.LONG, PEXCEPTION_POINTERS)
def crashHandler(exceptionInfo):
# Some code that deals with the unhandled C exception...
...
windll.kernel32.SetUnhandledExceptionFilter(crashHandler)
(我将在下面给出PEXCEPTION_POINTERS
的代码,因为我认为它与此问题无关。)
在其原始形式中,crashHandler
执行一些日志记录并关闭进程。我观察到它处理未处理的异常几次,因此我非常确信crashHandler
被正确地安装为未处理的异常过滤器。在
我对crashHandler
做了一些修改,现在想测试它。为此,我的想法是以编程方式引发一个C异常,然后由crashHandler
处理。我尝试了以下方法:
因此,异常会立即被Python解释器捕获,因此不会传播到mycrashHandler
。在
我如何才能a)禁用Python的异常处理,或者b)以编程方式引发一个C异常,该异常没有被Python的异常处理机制捕获并传播到我的crashHandler
?在
以下是PEXCEPTION_POINTERS
的代码:
from ctypes import Structure
import ctypes
EXCEPTION_MAXIMUM_PARAMETERS = 15
class EXCEPTION_RECORD(Structure):
pass
PEXCEPTION_RECORD = ctypes.wintypes.POINTER(EXCEPTION_RECORD)
EXCEPTION_RECORD._fields_ = [
('ExceptionCode', ctypes.wintypes.DWORD),
('ExceptionFlags', ctypes.wintypes.DWORD),
('ExceptionRecord', PEXCEPTION_RECORD),
('ExceptionAddress', ctypes.wintypes.LPVOID),
('NumberParameters', ctypes.wintypes.DWORD),
('ExceptionInformation', ctypes.wintypes.LPVOID * EXCEPTION_MAXIMUM_PARAMETERS),
]
class EXCEPTION_POINTERS(Structure):
_fields_ = [('ExceptionRecord', PEXCEPTION_RECORD),
('ContextRecord', ctypes.wintypes.LPVOID)]
PEXCEPTION_POINTERS = ctypes.wintypes.POINTER(EXCEPTION_POINTERS)
windll模块自动捕获调用中发生的windows SEH异常,并将其转换为WindowsError python异常。因此,它们不是未经处理的异常。在
你需要使用一个没有这么好的包装器的API。在
最好的办法是使用一个C扩展模块,它通过取消对随机指针(或null)的引用而导致访问冲突。在
相关问题 更多 >
编程相关推荐