LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1411|回复: 5

为什么C++的异常不起作用

[复制链接]
发表于 2007-7-23 23:53:22 | 显示全部楼层 |阅读模式
我按照一本C++入门书上写的例子编了一个很小的C++程序如下:
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.    int top = 90, bottom = 0;
  5.    cout << "top / 3 = " << top / 3 << endl;
  6.    try {
  7.       cout << "top / bottom = " << top / bottom << endl;
  8.    }
  9.    catch(...) {
  10.       cout << "There has a exception!" << endl;
  11.    }

  12.    cout << "done!" << endl;
  13.    return 0;
  14. }
复制代码

按照书上写的,程序应该打印"There has a exception!" 消息,然后输出 "done!" 后退出的,但是在我的机器上(debian4,g++4.1)执行到try{ }块内的语句时就直接报告说浮点数例外,然后程序就直接退出了,catch{}语句块根本就没有起作用,在fedora6上也是一样.但是到windows下用VC试了一下这个程序,运行一切正常,我想程序应该是没有问题的,是不是linux下有什么别的设置啊?还望高手指点!
我使用的是debian 4.0, g++4.1.
发表于 2007-7-24 10:25:17 | 显示全部楼层
因此,你看的这本入门书是针对 VC 写的。最好的解决办法是换一本书。
回复 支持 反对

使用道具 举报

发表于 2007-7-24 12:38:51 | 显示全部楼层
SIGFPE虽然能捕获,但是不知道如何处理才能让程序恢复运行
回复 支持 反对

使用道具 举报

发表于 2007-7-24 23:08:18 | 显示全部楼层
这里有篇文章说明这个问题: http://www.jdl.co.uk/briefings/divByZeroInCpp.html
文章不长,我就转过来吧:
Divide by zero in C++

Why doesn't a divide-by-zero cause an exception in C++?

It was a specific design decision of C++ not to handle divide-by-zero; whereas Java and Ada, for example, take the opposite view. Why? The usual answers -- efficiency and an assumption that C++ will tend to be used with more of an awareness of the hardware.

Stroustrup says, in "The Design and Evolution of C++" (Addison Wesley, 1994), "low-level events, such as arithmetic overflows and divide by zero, are assumed to be handled by a dedicated lower-level mechanism rather than by exceptions. This enables C++ to match the behaviour of other languages when it comes to arithmetic. It also avoids the problems that occur on heavily pipelined architectures where events such as divide by zero are asynchronous."

So you must check your divisors yourself, or discover if your hardware maps divide-by-zero onto some other kind of exception and catch that. It's fairly easy to discover the latter. Just put a try {} catch (...) {} around a divide by zero.
显然,对于GCC的处理方式,答案就是自己检查除数(check your divisors yourself)。而且这似乎才是保证可移植性的方法。
Post by x11

SIGFPE虽然能捕获,但是不知道如何处理才能让程序恢复运行
我觉得SIGFPE的程序已经没有恢复运行的价值了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-24 23:35:56 | 显示全部楼层
我的英语不大好,这段话的意思是不是就是说C++对于底层的算术运算的异常(如算术溢出,被零除)是不支持的,所以说LINUX中g++的反应是正常的,而Windows 下VC的反应反而是对C++标准不严格遵守的表现了?这样理解对吗?
回复 支持 反对

使用道具 举报

发表于 2007-7-25 10:05:55 | 显示全部楼层
简单来讲, C++ 对于底层事件不直接进行处理,而是交给相对应的底层机制来处理。 C++ 编译器可以实现对其的处理,但这将不保证可移植性。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表