通常,引发异常的函数将传递一个对象。这样做的重要有点之一是,可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常。另外,对象可以携带信息,程序员可以根据这些信息来确定引发异常的原因。同时,catch块可以根据这些信息来决定采取什么样的措施。
下面的两个程序用语言是这个效果。如果函数hmean()引发bad_mean异常,第一个catch块将捕获该异常;如果gmean()引发bad_gmaen异常,异常将逃过第一个catch块,被第二个catch块捕获。
exc_mean.h
// exc_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 "; } 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 "; }
error4.cpp
// error4.cpp -- using exception classes #include <iostream> #include <cmath> // or math.h, unix users may need -lm flag #include "exc_mean.h" // function prototypes double hmean(double a, double b); double gmean(double a, double b); int main() { using std::cin; using std::cout; 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. "; 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. "; break; } // end of catch block } cout << "Bye! "; 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); }
效果:
Enter two numbers: 4 12 Harmonic mean of 4 and 12 is 6 Geometric mean of 4 and 12 is 6.9282 Enter next set of numbers <q to quit>: 5 -5 hmean(5, -5): invalid arguments: a = -b Try again. 5 -2 Harmonic mean of 5 and -2 is -6.66667 gmean() arguments should be >= 0 Values used: 5, -2 Sorry, you don't get to play any more. Bye!