use*_*733 2 c++ exception divide-by-zero
Stroustrup在"C++的设计和演变"(Addison Wesley,1994)中说,"低级事件,例如算术溢出和除以零,假定由专用的低级机制而不是异常处理这使得C++能够在算术运算时匹配其他语言的行为.它还避免了在流水线严重的体系结构中出现的问题,其中除以零之类的事件是异步的.
Q1:如果不是例外,为什么GCC会报告一个而不是一个较低级别的错误?
Q2:鉴于我正在划分整数,为什么报告为浮点数?
鉴于我无法用catch(...)来捕捉它,这是非常误导的.显然我可以测试并避免整个'错误',但我的观点是,对于一个认为它可能是异常(合理)的初学者来说,它是非常混乱的,试图抓住它,然后发现它不是异常,并且对报告的运行时异常感到奇怪.
我的编译器是gcc版本4.2.1(Apple Inc. build 5666)(第3点)
准确澄清CPU异常,FPU异常,语言异常和操作系统异常之间的区别可能会解决这个问题.
示例程序:
int main(){
int i=1/0;
return i;
}
Run Code Online (Sandbox Code Playgroud)
结果输出:
浮点异常
浮点异常(FPE)不是C++异常.各种系统中有几种类型的例外,它们不可互换.FPE是微处理器或ISA级别的例外,但不是C++级别的例外.FPE可能会导致触发一个名为SIGFPE的信号,您可以处理但不使用C++ try/catch.如果你想处理它,你可以使用POSIX函数sigaction(我认为在Windows上会使用结构化异常处理).