将浮点异常转换为C ++异常
是否可以在x86 Linux上将浮点异常(信号)转换为C ++异常?
这是出于调试目的,因此不可移植性和不完善性是可以的(例如,如果不能100%保证所有析构函数都被调用)。
解决方案
回答
由于信号和异常的工作方式,我们不能在抛出信号时立即执行异常操作,异常依赖于堆栈的某些方面,而某些方面在调用信号处理程序时不正确。
我们可以在信号处理程序中设置一个全局变量,然后在程序中的关键点进行检查,并设置一个异常(如果已设置)。但是,这不会为我们提供有关引发的异常的确切信息。
回答
我没有现成的解决方案,但是我们可以看的一件事就是信号(不确定是否可以安全地从它们中抛出C ++异常,但是无论如何它应该有助于调试。)
我们可以为SIGFPE安装信号处理程序,并将其用于调试目的。
回答
基本思想是让我们为浮点异常安装适当的信号处理程序。在信号处理程序内部,我们可以引发异常(或者将用户定义的信号发送到将引发异常的另一个进程,或者将消息发送到另一个线程以获取类似信息,等等,等等,等等)。实际引发异常的方法有很多种,主要的是处理信号。
回答
gcc选项-fnon-call-exceptions可能对我们有用。虽然找不到任何文档,所以工作量可能会有所不同。
回答
如果C ++标准库实现支持TR1函数
你可以检测五种浮点错误,然后抛出任何想要的异常。
有关这些功能的说明,请参见此处。
我还建议使用Pete Becker的书《 The C ++ Standard Library Extensions:A Tutorial and Reference》(书号:ISBN-13:9780321412997)中的12.3节"管理浮点环境",以示例代码的形式对这些功能进行出色的描述。
替代文字http://ak.buy.com/db_assets/prod_images/225/202452225.jpg