00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00016 #include <stdio.h>
00017 #include <vector>
00018 #include "cexception.hpp"
00019
00020 using namespace std;
00021
00023 class ExampleCException : public CException {
00024 protected:
00025 ExampleCException(const FileLine& loc, const std::string& msg,
00026 sh_ptr<CException> nest) : CException(loc, msg, nest) {}
00027
00028 public:
00029 friend sh_ptr<CException> newExampleCException(const FileLine& loc,
00030 const std::string& msg, sh_ptr<CException> nest=sh_ptr<CException>());
00031
00032 virtual std::string getClassName() const { return "ExampleCException"; }
00033 };
00034
00035 inline sh_ptr<CException> newExampleCException(const CException::FileLine& loc,
00036 const std::string& msg, sh_ptr<CException> nest)
00037 {
00038 #ifndef DERS_RETHROW_BUG
00039
00040 return sh_ptr<CException>(new ExampleCException(loc, msg, nest));
00041 #else
00042
00043
00044
00045
00046
00047 return CException::current=sh_ptr<CException>(new ExampleCException(loc, msg,
00048 nest));
00049 #endif
00050 }
00051
00052 int i;
00053
00054 void g()
00055 {
00056
00057
00058
00059
00060 try {
00061 switch (i) {
00062
00063
00064 case 1: throw newExampleCException(_FLINE_, "Hello from g()");
00065
00066 case 2: {
00067 vector<int> v;
00068 v.at(0);
00069 }
00070
00071 case 3: throw 3;
00072 }
00073 }
00074
00075
00076
00077
00078
00079
00080 catch (...) {
00081 throw newCException(_FLINE_, "Problems in g()", toCException(_FLINE_));
00082 }
00083 }
00084
00085 void f()
00086 {
00087 try { g(); }
00088
00089 catch (...) {
00090 throw newCException(_FLINE_, "Problems in f()", toCException(_FLINE_));
00091 }
00092 }
00093
00094 int main()
00095 {
00096 for (i=1; i<=4; i++) {
00097 try {
00098 if (i<4) f();
00099
00100
00101 else throw 4;
00102 }
00103
00104
00105 catch (...) {
00106 printf("\tException #%d:\n%s", i,
00107 toCException(_FLINE_)->toStringAll().c_str());
00108 }
00109 }
00110 }