将浮点异常转换为C ++异常

时间:2008-09-17 17:40:49

标签: c++ exception floating-point signals

是否可以在x86 Linux上将浮点异常(信号)转换为C ++异常?

这是出于调试目的,因此不可移植性和不完美性(例如,如果不能100%保证所有析构函数都被调用)。

5 个答案:

答案 0 :(得分:8)

如果您的C ++标准库实现支持TR1函数 fetestexceptferaiseexceptfeclearexcept(我还没有,所以我无法对此进行测试)您可以检测到五种浮点错误,然后您可以抛出您想要的任何异常。

有关这些功能的说明,请参阅here

我还推荐Pete Becker所着的 The C ++标准库扩展:教程和参考一书中的第12.3节“管理浮点环境”,ISBN-13:9780321412997使用示例代码描述这些函数。

alt text

答案 1 :(得分:3)

由于信号和异常的工作方式,你不能在抛出信号时立即这样做 - 异常依赖于堆栈的某些方面,当信号处理程序被调用时,这些方面是不正确的。

您可以在信号处理程序中设置一个全局变量,然后在程序中的关键点进行检查,如果已设置则抛出异常。但是,这并没有提供有关抛出异常的确切信息。

答案 2 :(得分:3)

gcc选项 -fnon-call-exceptions 可能对你有用。虽然没有找到任何文件,但你的里程可能会有所不同。

答案 3 :(得分:1)

我没有现成的解决方案,但您可以看到的一件事是signals(不确定您是否可以安全地从它们中抛出C ++异常,但它无论如何都应该有助于调试。)

您可以为SIGFPE安装信号处理程序,并将其用于调试目的。

答案 4 :(得分:0)

基本思想是为浮点异常安装适当的信号处理程序。在信号处理程序中,您可以抛出异常(或将用户定义的信号发送到另一个进程,该进程将引发异常,或者向另一个线程发送消息以获取类似的内容等等)。实际抛出异常有多种方法 - 主要是处理信号。