C++ Builder 串口控件 | C++ Builder 编程技巧 | C++ Builder 操作指南 | C++ Builder 参考手册 | 基础知识 | cfloat 浮点数 | cmath 数学函数 | • acos, acosf, acosl | • acosh, acoshf, acoshl | • asin, asinf, asinl | • asinh, asinhf, asinhl | • atan, atanf, atanl | • atan2, atan2f, atan2l | • atanh, atanhf, atanhl | • ceil, ceilf, ceill | • copysign, copysignf, copysignl | • cos, cosf, cosl | • cosh, coshf, coshl | • exp, expf, expl | • exp2, exp2f, exp2l | • expm1, expm1f, expm1l | • fabs, fabsf, fabsl | • floor, floorf, floorl | • fmod, fmodf, fmodl | • frexp, frexpf, frexpl | • hypot, hypotf, hypotl | • ldexp, ldexpf, ldexpl | • log, logf, logl | • log10, log10f, log10l | • log1p, log1pf, log1pl | • log2, log2f, log2l | • modf, modff, modfl | • nan, nanf, nanl | • poly, polyl | • pow, powf, powl | • pow10, pow10l | • round, roundf, roundl | • sin, sinf, sinl | • sinh, sinhf, sinhl | • sqrt, sqrtf, sqrtl | • tan, tanf, tanl | • tanh, tanhf, tanhl | • trunc, truncf, truncl | • _exception, _exceptionl | • _matherr, _matherrl | • HUGE_VAL, HUGE_VALF, HUGE_VALL, _LHUGE_VAL | • EDOM, ERANGE | • _mexcep, DOMAIN, SING, OVERFLOW, UNDERFLOW, TLOSS, PLOSS, STACKFAULT | • M_E, M_LOG2E, M_LOG10E, M_LN2, M_LN10 | • M_PI, M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI | • M_SQRT2, M_SQRT_2 | • DOMAIN error 定义域错误 | cstdlib 标准库函数 | System 字符串 | System 日期和时间 | System.Math.hpp 数学函数 | 其他数据类型 | VCL 基础类 | VCL 应用程序 | Pictures 图片 | Graphics 绘图 | Additional 控件 | System 控件 | A ~ Z 字母顺序排列的目录 | 网友留言/技术支持 |
|
_matherr, _matherrl - cmath 数学函数的异常捕获和异常处理函数 |
• 如果程序里面实现了 _matherr 和 _matherrl 函数,当 cmath / math.h 函数无法计算或计算出错的时候,会自动调用 _matherr 和 _matherrl 函数来处理异常。这两个函数必须是 C 语言格式的,不可以是 C++ 格式,不可以放在命名空间里面。如果使用 C++ 编译器,需要放在 extern "C" { } 里面,或者直接用 extern "C" 修饰。
• cmath / math.h 函数出错产生的异常无法使用 try ... catch 来捕获,只可以通过 _matherr 和 _matherrl 函数捕获异常。
• C++11 标准规定使用全局变量 math_errhandling = MATH_ERRNO; 函数运算出错时使用 errno 错误编码,不抛出异常。目前所有的 C++ Builder 版本都不支持 math_errhandling 这个全局变量,只能通过 _matherr 和 _matherrl 函数捕获异常。
函数原型:
函数原型 |
Turbo C/C++
Borland C++ |
Visual C++ |
C90 |
C99 |
C++98 |
C++11 |
int _matherr(struct _exception *e); |
√ |
√ |
|
|
|
|
int _matherrl(struct _exceptionl *e); |
√ |
√ |
|
|
|
|
头文件:
#include <cmath>
命名空间:
无。由于为了兼容 C 语言的捕获异常方式,_exception 和 _exceptionl 结构体,与 _matherr 和 _matherrl 函数都不在命名空间里面
参数:
e:_exception 或 _exceptionl 类型的结构体
返回值:
0:这是一个错误,系统显示异常提示窗口;
不等于 0 的数值:运算成功,系统不显示异常提示窗口。
例子:
这段代码放在项目里面的任何一个 .c 或 .cpp 里面的任何位置都可以捕获 cmath / math.h 函数的异常。
#ifdef __cplusplus
extern "C" {
#endif
int _matherr(struct _exception *e) // 捕获 double 版本的函数异常
{
return 1; // 忽略错误,计算结果为 +INF, -INF 或 NAN
}
int _matherrl(struct _exceptionl *e) // 捕获 long double 版本的函数异常
{
return 1; // 忽略错误,计算结果为 +INF, -INF 或 NAN
}
#ifdef __cplusplus
} // extern "C"
#endif
|
兼容性:
_matherr 和 _matherrl 函数与 _exception 和 _exceptionl 结构体,不是标准 C/C++ 的内容。
C++ Builder 和 Visual C++ 都是用这个方法捕获的 cmath / math.h 函数异常,并且兼容早期版本的 Turbo C/C++ 和 Borland C++。
在 MSDN 里面可以找到这些内容在 Visual C++ 里面应用的描述。
相关链接:
• _exception • _mexcep • DOMAIN error 定义域错误 • 浮点数异常处理
|
|
|
|