#include #include using namespace std; class ZeroDenominator { public: ZeroDenominator() {} friend ostream& operator<<(ostream& out, const ZeroDenominator& error); }; class Fraction { int numer, denom; public: Fraction(int n = 0, int d = 1) : numer(n), denom(d) { cout << "Fraction constructor called\n"; if (denom == 0) throw ZeroDenominator(); } ~Fraction() { cout << "Fraction destructor called\n"; } friend ostream& operator<<(ostream& o, const Fraction& f) { return (o << f.numer << '/' << f.denom); } }; class InputError { string stream; public: InputError(string name) : stream(name) {} friend ostream& operator<<(ostream& out, const InputError& error); }; ostream& operator<<(ostream& out, const InputError& error) { out << "Error in " << error.stream << endl; return out; } ostream& operator<<(ostream& out, const ZeroDenominator& /*error*/) { out << "ZeroDenominator Error" << endl; return out; } int main() { int i1, i2; cout << "Enter two ints => "; try { cin >> i1 >> i2; if (cin.fail()) throw InputError("cin"); // You could also use (!cin) instead of (cin.fail()) // cin.bad() did not detect error in cin Fraction f(i1,i2); cout << f << endl; // Should this line be in the try block? } catch (const InputError& error) { cerr << error << endl; } catch (const ZeroDenominator& errmsg) { cerr << errmsg << endl; } catch (...) { cerr << "help\n"; } cout << "*** End of Program ***\n"; }