The following program illustrates exception handling.
catch (...).1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// exceptions/exception-test.cpp - Test exceptions.
// 2004-02-10 - Fred Swartz
//==================================== includes
#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;
//================================================ prototypes
void generateException(int whichException);
//====================================================== main
int main() {
for (int i=1; ; i++) { // Loop forever
try {
cout << i;
generateException(i);
} catch (out_of_range orex) {
cout << " Catching: out_of_range "<< orex.what() << endl;
} catch (const char* mess) {
cout << " Catching: const char* " << mess << endl;
} catch (string smess) {
cout << " Catching: string " << smess << endl;
} catch (int iex) {
cout << " Catching: int " << iex << endl;
} catch (runtime_error rex) {
cout << " Catching: runtime_error " << rex.what() << endl;
} catch (exception eex) {
cout << " Catching: " << eex.what() << endl;
} catch (...) {
cout << " ERROR: Nobody caught this!" << endl;
}
}
system("PAUSE"); // Keep Dev-C++ window open
return 0;
}
//========================================= generateException
void generateException(int whichException) {
switch (whichException) {
case 1:
cout << " Throwing out_of_range()" << endl;
throw out_of_range("out_of_range meaningful comment");
break;
case 2:
cout << " Throwing exception() // Can't specify comment" << endl;
throw exception(); // Doesn't take comment text.
break;
case 3:
cout << " Throwing underflow_error // caught by base class (runtime_error)" << endl;
throw underflow_error("underflow_error");
break;
case 4:
cout << " Throwing runtime_error" << endl;
throw runtime_error("a comment");
break;
case 5:
cout << " Throwing length_error // caught be super-super-class (exception)" << endl;
throw length_error("length_error");
break;
case 6:
cout << " Throwing int" << endl;
throw 26;
break;
case 7:
cout << " Throwing const char*" << endl;
throw "This is a const char*";
break;
case 8:
cout << " Throwing string" << endl;
throw string("I'm a string");
break;
case 9:
cout << " Throwing float" << endl;
throw 3.14159;
break;
default:
cout << " Throwing up" << endl;
system("PAUSE");
exit(0);
}
return;
}
|
The following output is from Dev-C++ (using gcc version ?).
MS Visual C++ v6 gives a similar result, differing only in what catching exception prints.
1 Throwing out_of_range()
Catching: out_of_range out_of_range meaningful comment
2 Throwing exception() // Can't specify comment
Catching: St9exception
3 Throwing underflow_error // caught by base class (runtime_error)
Catching: runtime_error underflow_error
4 Throwing runtime_error
Catching: runtime_error a comment
5 Throwing length_error // caught be super-super-class (exception)
Catching: St9exception
6 Throwing int
Catching: int 26
7 Throwing const char*
Catching: const char* This is a const char*
8 Throwing string
Catching: string I'm a string
9 Throwing float
ERROR: Nobody caught this!
10 Throwing up