首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Visual Studio2008 C++中捕获被零除错误?

如何在Visual Studio2008 C++中捕获被零除错误?
EN

Stack Overflow用户
提问于 2009-12-02 21:11:00
回答 9查看 12.5K关注 0票数 7

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

我试过这个:

代码语言:javascript
复制
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");
}

但这是通用的..。捕捉块。我知道特定于MS的__try在这里可能很有用,但我更喜欢标准的C++,而且在任何情况下我都有阻止使用__try的析构函数。

说明:为了便于讨论,对上面的代码进行了简化。实际上,被零除是一个错误,它发生在第三方DLL中,我没有源代码。错误取决于我传递给库的参数(复杂结构的句柄),但不是以任何明显的方式。所以,我希望能够优雅地恢复。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-12-02 22:51:22

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

你必须克服一些障碍才能让它像你想要的那样工作,但它是可以做到的。

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

代码语言:javascript
复制
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);
}

然后,您可以简单地以常规方式在C++中捕获您的CMyFunkyDivideByZeroException()

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

票数 8
EN

Stack Overflow用户

发布于 2009-12-02 21:14:33

C++本身并不将被零除作为异常来处理。

引用Stroustrup:

“低级事件,如算术溢出和被零除,假定由专用的低级机制处理,而不是由异常处理。这使得C++在涉及算术时能够与其他语言的行为相匹配。它还避免了在大量流水线架构上发生的问题,在这种体系结构中,事件被零除等是异步的。”

“C++的设计和发展”(Addison Wesley,1994)

在任何情况下,异常都不会被替换为正确的前置条件处理()。

票数 9
EN

Stack Overflow用户

发布于 2011-11-22 20:01:04

要在Visual C++中捕获除以零的异常,请尝试->捕获(...)只需在项目设置中启用/EHa选项。请参见项目属性-> C/C++ -> Code Generation -> Modify the Enable C++ Exceptions to "Yes With SEH Exceptions"。就这样!

详情请看这里:http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1832809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档