调用abort()
Abort()函数的原型位于头文件cstdlib(或stdlib.h)中,其典型实现是向标准错误流(即cerr使用的错误流)发送消息abnormal program termination(程序异常终止)。它还返回一个随实现而异的值,告诉操作系统(如果程序是由另一个程序调用的,则告诉父进程),处理失败。abort()是否刷新文件缓冲区(用于存储读写到文件中的数据的内存区域)取决于实现。当然,也可以使用exit(),该函数刷新文件缓冲区,但不显示消息。在子函数中调用abort()将直接终止程序,而不是先返回到main()程序。一般而言,显示的程序异常中断消息随编译器而异。
#include<iostream>
#include<cstdlib>
double hmean(double a, double b);
int main()
{
double x, y, z;
std::cout << "Enter two numbers: ";
while (std::cin >> x >> y)
{
z = hmean(x, y);
std::cout << "Harmonic mean of " << x << " and " << y << " is " << z << std::endl;
std::cout << "Enter next set of numbers <q to exit>: ";
}
std::cout << "Bye!\n";
system("pause");
}
double hmean(double a, double b)
{
if (a == -b)
{
std::cout << "untenable arguments to hmean()\n";
std::abort();
}
return 2.0 * a * b / (a + b);
}
返回错误码
一种比异常终止更灵活的方法是,使用函数的返回值来指出问题。可使用指针参数或引用参数来将值返回给调用程序,并使用函数的返回值来指出成功还是失败。
#include<iostream>
#include<cfloat>
bool hmean(double a, double b, double * ans);
int main()
{
double x, y, z;
std::cout << "Enter two numbers: ";
while (std::cin >> x >> y)
{
if (hmean(x, y, &z))
std::cout << "Harmonic mean of " << x << " and " << y << " is " << z << std::endl;
else
std::cout << "One value should not be the negative of the other - try again.\n";
std::cout << "Enter next set of numbers <q to exit>: ";
}
}
bool hmean(double a, double b, double * ans)
{
if (a == -b)
{
*ans = DBL_MAX;
return false;
}
*ans = 2.0 * a * b / (a + b);
return true;
}
异常机制
C++异常是对程序运行过程中发生的异常情况(例如被0除)的一种响应。异常提供了将控制权从程序的一个部分传递到另一个部分的途径。对异常的处理有3个组成部分:引发异常、使用处理程序捕获异常、使用try块。
#include<iostream>
double hmean(double a, double b);
int main()
{
double x, y, z;
std::cout << "Enter two numbers: ";
while (std::cin >> x >> y)
{
try
{
z = hmean(x, y);
}
catch (const char *s)
{
std::cout << s << std::endl;
std::cout << "Enter a new pair of numbers: ";
continue;
}
std::cout << "Harmonic mean of " << x << " and " << y << " is " << z << std::endl;
std::cout << "Enter next set of numbers <q to exit>: ";
}
std::cout << "Bye!\n";
system("pause");
}
double hmean(double a, double b)
{
if (a == -b)
throw "bad hmean() argument: a = -b not allowed";
return 2.0 * a * b / (a + b);
}
程序在出现问题时将引发异常。throw语句实际上是跳转,即命令程序调到另一条语句。throw关键字表示引发异常,紧随其后的值(例如字符串或对象)指出了异常的特征。
程序使用异常处理程序(exceptionhandler)(也称catch块)来捕获异常,异常处理程序位于要处理问题的程序中。catch关键字表示捕获异常。处理程序以关键字catch开头,随后是位于括号中的类型声明,它指出了异常处理程序要响应的异常类型;然后是一个用花括号括起的代码块,指出要采取的措施。catch关键字和异常类型用作标签,指出异常被引发时,程序应调到这个位置执行。
try块标识其中特定的异常可能被激活的代码块,它后面跟一个或多个catch块。关键字try后面的代码块表明需要注意这些代码引发的异常。上面代码中,如果程序在try块的外面调用hmean(),将无法处理异常。
将对象用作异常类型
通常,引发异常的函数将传递一个对象。这样做可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常。另外,对象可以携带信息,程序员可以根据这些信息来确定引发异常的原因。下面,bad_hmean和bad_gmean是两个不同的类
try
{
...
}
catch (bad_hmean & bg)
{
...
}
catch (bad_gmean & hg)
{
...
}