异常是相对较新的C++功能,有些老式编译器可能没有实现。另外有些编译器可能默认关闭这一特性,需要使用编译器选项来打开它。
这里先讨论一个基本问题:
2.0 * x * y / (x+y)
如果y是x的负值,则上述公式将导致被零除。这是一种不允许的运算。很多新式编译器通过生产一个表示无穷大的特殊浮点值来处理。
例如Inf,inf,INF等。
对于这种问题,处理方式之一就是,如果其中一个参数是另一个参数的负值,则调用abort()函数。
Abort()函数的原型位于头文件cstdlib中,其典型实现是向标准错误流发送消息abnormal program termination(程序异常终止),然后终止程序。
它还返回一个随实现而异的值,告诉操作系统,实现失败。
abort()函数是否刷新文件缓冲区取决于实现。
如果愿意,也可以使用exit(),该函数刷新文件缓冲区,但不显示消息。
文件缓冲区:用于存储读写到文件的数据的内存区域。
1 #error1.cpp --using the abort() function 2 #include <iostream> 3 #include <cstdlib> 4 double hmean(double a, double b); 5 6 int main() 7 { 8 double x,y,z; 9 std::cout<<"Enter two numbers:"; 10 while() 11 { 12 z=hmean(x,y); 13 std::cout<<"Harmonic mean of"<<x<<"and"<<y 14 <<"is"<<z<<std:endl; 15 std::cout<<"Enter next set of numbers<q to quit>:"; 16 17 } 18 std::cout<<"Bye!\n"; 19 return 0; 20 } 21 22 double hmean(double a, double b) 23 { 24 if(a == -b) 25 { 26 std::cout<<"untenable arguments to hmean()\n"; 27 std::abort(); 28 } 29 return 2.0*a*b/(a+b); 30 }
为了避免异常终止,程序应在调用hmean()函数之前检查x和y的值。然而,依靠程序员来执行这种检查是不安全的。