error.h
#ifndef ERROR_H_
#define ERROR_H_
#include<stdexcept>
#include <iostream>
class bad_hmean:public std::logic_error
{
private:
double v1;
double v2;
public:
bad_hmean(double a = 0, double b = 0) : logic_error("bad arguments to bad_hmean()"),v1(a), v2(b) {}
const char* what() { return "invalid arguments: a = -b\n"; }
};
// class bad_gmean
class bad_gmean:public std::logic_error
{
public:
double v1;
double v2;
bad_gmean(double a = 0, double b = 0) : logic_error("bad arguments to bad_gmean()"),v1(a), v2(b) {}
const char * what() {return "gmean() arguments should be >= 0\n";}
};
#endif
main.cpp
//error4.cpp – using exception classes
#include <iostream>
#include <cmath> // or math.h, unix users may need -lm flag
#include "error.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
{
cout << bg.what();
cout << "Try again.\n";
continue;
}
catch (bad_gmean & hg)
{
cout << hg.what();
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";
system("pause");
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);
}