C + + try-catch块不捕捉硬件exception

我正在检查visual studio 2013中的硬件和软件exception。我知道我可以通过设置“启用C ++exception”选项/ EHa来捕获硬件exception(是的,SEHexception)。 我试图捕捉以下例外

EXCEPTION_ARRAY_BOUNDS_EXCEEDED – 没有收到

EXCEPTION_ACCESS_VIOLATION – 抓到了

EXCEPTION_INT_OVERFLOW – 没有捕获

EXCEPTION_INT_DIVIDE_BY_ZERO – 被抓到

这是一个代码的例子。

try { a = std::numeric_limits<int>::max(); a += 5; } catch (...){ std::cout << "EXCEPTION_INT_OVERFLOW Exception Caught" << std::endl; exit(1); } try { int h = 0; b = b / h; } catch (...){ std::cout << "EXCEPTION_INT_DIVIDE_BY_ZERO Exception Caught" << std::endl; exit(1); } 

它只捕获零除exception。 这是处理器的依赖,还是有别的? 还有一个小问题,debugging版本和发布版本有什么不同?

Solutions Collecting From Web of "C + + try-catch块不捕捉硬件exception"

这是处理器的依赖

对。 操作系统只将硬件陷阱映射到结构化的异常,它不添加逻辑来检测硬件不支持的条件。 (另一方面,像JVM或CLR这样的托管框架通常会添加逻辑,当然,软件捕获这些逻辑会带来性能损失,而硬件陷阱逻辑是免费的,除非实际发生陷阱。)

现在,这并不是说您无法在x86处理器上收到EXCEPTION_INT_OVERFLOW 。 但条件不是你所期望的 – 只是在加入过程中环绕不会造成陷阱。 请参阅Raymond Chen的博客文章:

  • 在红色的角落, EXCEPTION_INT_DIVIDE_BY_ZEROSTATUS_INTEGER_DIVIDE_BY_ZERO ; 并在蓝色的角落, EXCEPTION_INT_STATUS_INTEGER_OVERFLOW