引发异常的函数不但可以传递整型,字符串等常用类型,还可以传递一个对象。传递对象的优点是:可以使用不同的异常类型来区分不同的函数在不同的情况下引发的异常。此外,对象可以携带信息,并可以根据这些信息来确定引发异常的原因;同时,catch 可以根据这些信息来决定采取什么样的措施。
考虑下面的代码:
exec_mean.h
[C++] 纯文本查看 复制代码 // exec_mean.h -- exception classes for hmean(), gmean()
#include <iostream>
class bad_hmean
{
private:
double v1;
double v2;
public:
bad_hmean(double a = 0, double b = 0) : v1(a), v2(b){}
void mesg();
};
inline void bad_hmean::mesg()
{
std::cout << "hmean(" << v1 << ", " << v2 << "): "
<< "invalid arguments: a = -b\n";
}
class bad_gmean
{
public:
double v1;
double v2;
bad_gmean(double a = 0, double b = 0) : v1(a), v2(b){}
const char * mesg();
};
inline const char * bad_gmean::mesg()
{
return "gmean() arguments should be >= 0\n";
}
error4.cpp
[C++] 纯文本查看 复制代码 //error4.cpp – using exception classes
#include <iostream>
#include <cmath> // or math.h, unix users may need -lm flag
#include "exec_mean.h"
// function prototypes
double hmean(double a, double b);
double gmean(double a, double b);
int main()
{
using std::cout;
using std::cin;
using std::endl;
double x, y, z;
cout << "Enter two numbers: ";
while (cin >> x >> y)
{
try { // start of try block
z = hmean(x, y);
cout << "Harmonic mean of " << x << " and " << y
<< " is " << z << endl;
cout << "Geometric mean of " << x << " and " << y
<< " is " << gmean(x, y) << endl;
cout << "Enter next set of numbers <q to quit>: ";
}// end of try block
catch (bad_hmean & bg) // start of catch block
{
bg.mesg();
cout << "Try again.\n";
continue;
}
catch (bad_gmean & hg)
{
cout << hg.mesg();
cout << "Values used: " << hg.v1 << ", "
<< hg.v2 << endl;
cout << "Sorry, you don't get to play any more.\n";
break;
} // end of catch block
}
cout << "Bye!\n";
// cin.get();
// cin.get();
return 0;
}
double hmean(double a, double b)
{
if (a == -b)
throw bad_hmean(a, b);
return 2.0 * a * b / (a + b);
}
double gmean(double a, double b)
{
if (a < 0 || b < 0)
throw bad_gmean(a, b);
return std::sqrt(a * b);
}
在上面的主程序中,有两个计算式,一个是计算两个数的调和平均数(两个数字倒数的平均值的倒数, hmean() 函数);另一个是计算几何平均值,即乘积的平方根(gmean() 函数)。
从 hmean() 中可以看到,当传递进来的两数如果互为负数,那么将引发被 0 除的异常,此时通过 throw 抛出一个 bad_hmean 对象,同时用传递进来的两个参数 a 和 b 对其初始化。
从 gmean() 中可以看到,当传递进来的两数若有一个为负数,那么将引发异常,此时抛出一个 bad_gmean() 异常,同时用传递进来的两个参数 a 和 b 对其初始化。
|