- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是一段简单的代码,其中发生了被零除。我试图捕获它:
#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 计算机上进行这些测试,但希望让它跨平台。
最佳答案
这也不异常(exception)。这是一个错误,在硬件级别确定并返回给操作系统,然后操作系统以某种特定于操作系统的方式通知您的程序(例如,通过杀死过程)。
我相信在这种情况下发生的事情不是异常(exception),而是一个信号。如果是这种情况:操作系统会中断您程序的主控制流并调用信号处理程序,这反过来会终止程序的操作。
这与取消引用空指针时出现的错误类型相同(然后您的程序因 SIGSEGV 信号而崩溃,段错误)。
您可以尝试使用 <csignal>
中的函数 header 尝试为 SIGFPE 信号提供自定义处理程序(它用于浮点异常,但可能是整数除以零时引发的情况 - 我在这里真的不确定)。但是您应该注意,信号处理是依赖于操作系统的,并且 MinGW 以某种方式“模拟”了 Windows 环境下的 POSIX 信号。
这是在 MinGW 4.5、Windows 7 上的测试:
#include <csignal>
#include <iostream>
using namespace std;
void handler(int a) {
cout << "Signal " << a << " here!" << endl;
}
int main() {
signal(SIGFPE, handler);
int a = 1/0;
}
输出:
Signal 8 here!
在执行信号处理程序后,系统立即终止进程并显示错误消息。
使用它,您可以在除以零或空指针取消引用后关闭任何资源或记录错误...但 与异常不同,即使在异常情况下也不能控制程序的流程。 一个有效的程序不应该那样做。捕获这些信号仅对调试/诊断有用。
(有一些有用的信号通常在低级编程中非常有用,并且不会导致您的程序在处理程序之后立即被杀死,但这是一个很深的话题)。
关于C++ : Catch a divide by zero error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747934/
我是一名优秀的程序员,十分优秀!