C++ try-catch 块不捕获硬件异常

C++ try-catch block doesn't catch hardware exception

我正在检查 visual studio 2013 年的硬件和软件异常。我知道我可以通过将 'Enable C++ Exceptions' 选项设置为 /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);
}

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

Is this dependent of processor

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

现在,这并不是说您无法在 x86 处理器上接收 EXCEPTION_INT_OVERFLOW。但条件不是您所期望的——加法期间的简单回绕不会导致陷阱。参见 Raymond Chen 的博文: