我正在尝试通过帮助来实现处理Windows异常
__try/__except
阻止。
问题是程序永远不会进入__except
阻止 - 只能退出错误。
工作区: 操作系统:Windows 7 x64;框架:Embarcadero XE5 C ++ Builder; 应用程序模板类型:控制台64位应用程序(32位正常工作!)
代码:
void foo()
{
__try
{
int *p = 0;
fprintf(stderr, "before action");
*p = 1;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("in __except block\n");
throw("");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
try
{
foo();
}
catch(...)
{
printf("in catch block\n");
}
printf("end of main\n");
return 0;
}
输出:
before action
然后错误退出
在第二个版本中,我以这种方式添加了异常处理程序:
LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS p)
{
printf("in excepiton filter\n");
return EXCEPTION_EXECUTE_HANDLER;
}
int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(1, MyVectorExceptionFilter);
// the same text
// ...
}
在此之后我得到了这个输出:
输出:
before action
in excepiton filter
然后错误退出
为什么程序不进入__ except
块?
进入异常处理程序后有没有办法继续正常工作?
答案 0 :(得分:2)
进入异常处理程序后有没有办法继续正常工作?
取决于异常,以及它对您的程序意味着什么。唯一的建议是遵循命名 - 例外是例外。可能是读取会阻塞,在这种情况下你可以坐下来等待更多 - 或者可能是dll无法加载并且你的应用程序需要它 - 在这种情况下没有,你不能回收
答案 1 :(得分:2)
你必须保持一致。您可以使用C ++ try
和catch
来捕获C ++异常,或者您可以使用Microsoft结构化异常处理来捕获 __try
的低级错误,{ {1}}并最终__except
。
在您的示例中,您永远不会输入异常处理程序,因为使用C ++关键字__finally
错误地引入了受保护的块。
只需用try
替换有问题的try
,就可以使异常处理程序正确调用。