我正在检查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版本和发布版本有什么不同?
这是处理器的依赖
对。 操作系统只将硬件陷阱映射到结构化的异常,它不添加逻辑来检测硬件不支持的条件。 (另一方面,像JVM或CLR这样的托管框架通常会添加逻辑,当然,软件捕获这些逻辑会带来性能损失,而硬件陷阱逻辑是免费的,除非实际发生陷阱。)
现在,这并不是说您无法在x86处理器上收到EXCEPTION_INT_OVERFLOW
。 但条件不是你所期望的 – 只是在加入过程中环绕不会造成陷阱。 请参阅Raymond Chen的博客文章:
EXCEPTION_INT_DIVIDE_BY_ZERO
和STATUS_INTEGER_DIVIDE_BY_ZERO
; 并在蓝色的角落, EXCEPTION_INT_
和STATUS_INTEGER_OVERFLOW