如何在Visual Studio 2008 C++中捕获除零错误?

Jos*_*Fox 7 c++ exception-handling try-catch visual-studio-2008

如何在Visual Studio 2008 C++中捕获除零错误(而不是其他错误;以及能够访问异常信息)?

我试过这个:

try {
  int j=0;
  int i= 1/j;//actually, we call a DLL here, which has divide-by-zero
} catch(std::exception& e){
  printf("%s %s\n", e.what()); 
}  catch(...){
  printf("generic exception");
}
Run Code Online (Sandbox Code Playgroud)

但这是通用的...... catch块.我知道MS特定的__try在某种程度上可能有用,但我更喜欢标准的C++,并且在任何情况下我都有析构函数来阻止使用__try.

澄清:上面的代码被简化用于讨论目的.实际上,除零是一个在第三方DLL深处发生的错误,我没有源代码.错误取决于我传递给库的参数(复杂结构的句柄),但不是以任何明显的方式.所以,我希望能够优雅地恢复.

Yuv*_*dam 9

C++本身不处理被零除的例外情况.

引用Stroustrup:

"低级事件,例如算术溢出和除以零,假定由专用的低级机制而不是异常处理.这使得C++在算术时能够匹配其他语言的行为.避免在严重流水线架构上出现的问题,其中除以零之类的事件是异步的."

"C++的设计与演变"(Addison Wesley,1994)

在任何情况下,例外情况是从来没有进行适当的处理的前提条件更换.


Vol*_*kyy 9

要在Visual C++中捕获除以零的异常,请尝试 - > catch(...)在项目设置中启用/ EHa选项.请参阅项目属性 - > C/C++ - >代码生成 - >将启用C++例外修改为"是和SEH例外".而已!

详情请见:http: //msdn.microsoft.com/en-us/library/1deeycx5(v = vs.)


Len*_*ate 8

假设您不能简单地修复异常生成代码的原因(可能是因为您没有该特定库的源代码,也许是因为您无法在导致问题之前调整输入参数).

你必须跳过一些箍来让你按照自己的意愿工作,但是可以做到.

首先,您需要通过调用_set_se_translator()(请参阅此处)来安装结构化异常处理转换函数, 然后您可以检查在发生SEH异常时传递的代码并抛出适当的C++异常.

void CSEHException::Translator::trans_func(
    unsigned int code, 
    EXCEPTION_POINTERS *pPointers)
{
   switch (code)
   {
       case FLT_DIVIDE_BY_ZERO : 
          throw CMyFunkyDivideByZeroException(code, pPointers);
       break;
   }

   // general C++ SEH exception for things we don't need to handle separately....
   throw CSEHException(code, pPointers);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以CMyFunkyDivideByZeroException()用正常的方式捕获你的C++.

请注意,您需要在要转换异常的每个线程上安装异常转换功能.


Seb*_*ose 7

您可以使用结构化异常处理(使用__try等),也可以安装结构化异常处理程序转换器:_set_se_translator

这些都是特定于操作系统的.