首页 > 解决方案 > 每当设置某些数学 errno 值时,如何引发异常?

问题描述

errno只要只设置了全局变量的某些值(更具体地说,我只对域错误的值感兴趣),我就需要能够全局停止我的 C++ 代码的执行EDOM

我已经看到该库math_errhandling允许使用常量MATH_ERREXCEPT来自动为每种数学错误引发错误。

就我而言,我有兴趣FE_INVALID为我的代码中发生的每个域错误自动引发。

但是,我的代码本身已经处理了某些类型的数学错误,例如除零错误。因此,自动加注 anFE_DIVBYZERO是完全不受欢迎的。

是否有一种实用的方法可以使用math_errhandling或任何其他 C++ 库来实现这种部分异常引发?或者,我如何自己实现基于检查值的异常引发errno

标签: c++exception

解决方案


我怀疑你指的是math_errhandlingC++。那不是库,而是实现定义的常量,它告诉您实现如何处理错误处理。您不能通过 C++ 更改此常量的值,尽管您可能会通过某些编译器选项更改它的值(检查您的文档)。

即便如此,该标准仅定义了可能的值MATH_ERRNO==1,MATH_ERREXCEPT==2和 (隐含) MATH_ERRNO | MATH_ERREXCEPT==3。你想知道MATH_ERREXCEPT。这仅意味着您可以std::fetestexcept(FE_INVALID)在每次通话后拨打电话。它不是throw一个真正的 C++ 异常的自动,你可以catch

根本问题是 C++ 并不真正匹配面向矢量的现代 FP 硬件。对于高性能代码,编译器将合并许多操作,但 C++ 异常模型假定您可以查明确切的失败操作。IEEE754 受此影响较小,因为它的错误处理精度较低。使用NaN允许更多的并行性。


推荐阅读