6

我正在检查 Visual Studio 2013 中的硬件和软件异常。我知道我可以通过将“启用 C++ 异常”选项设置为 /EHa(是的,带有 SEH 异常)来捕获硬件异常。我正在尝试捕获以下异常:

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);
}

它只捕获除以零异常。这取决于处理器,还是其他原因?还有一个小问题,调试版本和发布版本之间有什么区别吗?

4

1 回答 1

3

这是否取决于处理器

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

现在,这并不是说您不能EXCEPTION_INT_OVERFLOW在 x86 处理器上接收。但是条件不是您所期望的——在添加过程中仅仅环绕不会导致陷阱。请参阅 Raymond Chen 的博客条目:

于 2015-04-19T22:35:26.927 回答