在阅读了速成课程 和这里的一些帖子之后,我实现了一个非常基本的版本。我唯一的要求是能够“捕获”任何异常(只有“Win32”,因为我不抛出/引发任何异常)并退出引发它的线程。我有一个正确原型化的函数,它只调用'ExitThread',还有一个'EXCEPTION_REGISTRATION'结构,它在它的处理程序属性中,以及在前一个属性中的实际前一个句柄。我设置这个处理程序的方法是调用:
BOOL set_my_handler(){
EXCEPTION_REGISTRATION* p_excep = &excep // excep is a global static EXCEPTION_REGISTRATION
__asm{
mov EAX, p_excep
mov FS:[0],EAX
}
...
}
问题: 当我导致异常时(比如:
* (dword*) 0 = 0;)
在我调用 set_my_handler 的同一范围内,我的处理程序按预期调用。但是,如果我在内部块中导致相同的异常,通过调用执行它的函数,它就是行不通的。我得到未处理的异常消息框。在调试时,我注意到 FS:[0] 在内部函数中保持不变(指向我的处理程序)。顺便说一句,我没有使用任何(try/catch 或 try/_except 在我的代码中)
感谢您的帮助,谢谢。
我的问题的答案(感谢Raymond Chen):事实证明,异常注册实体必须在堆栈上分配,因为有一种安全机制可以根据堆栈段寄存器验证其位置。