程序不会输入__except块

时间:2016-10-13 13:44:56

标签: c++ exception-handling

我正在尝试通过帮助来实现处理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块? 进入异常处理程序后有没有办法继续正常工作?

2 个答案:

答案 0 :(得分:2)

  1. * p = 1;不会抛出...你想要的是“throw std :: Exception()”
  2. 投掷相对昂贵See here,所以尝试{try {} catch {throw}} catch {}是不好的。只需要一次尝试捕捉
  3. (意见)坚持使用便携式东西 - 尝试抓住。 MS通过外观添加了这个,以便最终可以像java一样。如果您使用__try __catch,您将开始使用这些,当您必须在Linux上编写内容时,您会想知道它为什么不编译
  4.   

    进入异常处理程序后有没有办法继续正常工作?

    取决于异常,以及它对您的程序意味着什么。唯一的建议是遵循命名 - 例外是例外。可能是读取会阻塞,在这种情况下你可以坐下来等待更多 - 或者可能是dll无法加载并且你的应用程序需要它 - 在这种情况下没有,你不能回收

答案 1 :(得分:2)

你必须保持一致。您可以使用C ++ trycatch来捕获C ++异常,或者您可以使用Microsoft结构化异常处理来捕获 __try 的低级错误,{ {1}}并最终__except

在您的示例中,您永远不会输入异常处理程序,因为使用C ++关键字__finally错误地引入了受保护的块。

只需用try替换有问题的try,就可以使异常处理程序正确调用。