【发布时间】:2021-08-03 03:46:39
【问题描述】:
这是一段简单的代码,其中发生了被零除。我试图抓住它:
#include <iostream>
int main(int argc, char *argv[]) {
int Dividend = 10;
int Divisor = 0;
try {
std::cout << Dividend / Divisor;
} catch(...) {
std::cout << "Error.";
}
return 0;
}
但应用程序无论如何都会崩溃(即使我选择了 MinGW 的 -fexceptions 选项)。
是否有可能捕捉到这样的异常(我理解的不是 C++ 异常,而是 FPU 异常)?
我知道我可以检查除数 before 除数,但我假设,因为除以零很少见(至少在我的应用程序中),它会更多尝试除法(并在发生错误时捕获错误)比在除法之前每次测试除数时有效。
我正在一台 WindowsXP 计算机上进行这些测试,但希望让它跨平台。
【问题讨论】:
-
if (Divisor == 0) { std::cout << "Error."; exit; }。然后,您消除了导致这种情况发生的所有原因。然后,您可以删除条件并运送您的产品,而不会被零除。 -
(
assert(Divisor != 0)会更规范。不要忘记通过调试器运行开发!) -
这甚至不是 FPU 异常,而是 CPU 异常。 FPU 处理浮点数,但你会得到 NaN 或无穷大,而不是崩溃。
-
经验法则:总是(如果你错过了重点:总是!)在进行计算之前检查你的输入,你可以避免这些类型的问题。
-
“我做了这样的假设,因为除以零很少见(至少在我的应用程序中),它会更有效” - 然后不要这样做运行分析器之前的假设。突然做出假设是优化失败的一种方式。相信您的优化器和 CPU 的分支预测。
标签: c++ performance exception-handling mingw