/* test program for exception handling on indies, compile with g++ -fhandle-exceptions c++test.C -o c++test.irix53 g++ -fhandle-exceptions c++test.C -o c++test.solaris4x_55 CC c++test.C -o c++test.CC.solaris4x_55 */ #include class test { public: int blabla; test(int i) : blabla(i) {cout << "Variable of type test is being instantiated. Value=" << i << "\n";} ~test() {cout << "Variable of type test is going out of scope. Value=" << blabla << "\n";} }; class error { public: int errno; error (int i) : errno (i) { cout << "Error is being instantiated, errno=" << errno << "\n"; } ~error () { cout << "Error is going out of scope, errno=" << errno << "\n"; errno = -errno; cout << "Now: errno=" << errno << "\n"; } virtual void print () { cout << "class error, errno=" << errno << "\n"; } }; class derivederror: public error { public: float addition; derivederror (int i, float f) : error (i) { addition = f; cout << "Derived Error is being instantiated, addition=" << addition << "\n"; } ~derivederror () { cout << "Derived Error is going out of scope, addition=" << addition << "\n"; } virtual void print () { cout << "class derivederror, errno=" << errno << ",addition=" << addition << "\n"; } }; void f (int i) { cout << "f() starting: i=" << i << "\n"; test i4(4); if (i >= 0) { cout << "OK\n"; } else { cout << "Throwing exception\n"; throw derivederror (i, 1./i); } cout << "f() finished\n"; } test i1(1); int main() { cout << "main() starting...\n"; test i2(2); { test i3(3); try { f (2); f (-3); cout << "Should not arrive here\n"; } catch (error& e) { cout << "Caught error number " << e.errno << "\n"; e.print(); } catch (derivederror& e) { cout << "Caught derived error number " << e.errno << "\n"; e.print(); } } cout << "main() ending...\n"; return 0; }