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 的博文:
我正在检查 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 的博文: