klao@1157: #include klao@1157: #include klao@1157: klao@1157: #include klao@1157: klao@1157: using namespace std; klao@1157: klao@1157: class Ex : public exception { klao@1157: klao@1157: typedef exception Parent; klao@1157: klao@1157: mutable klao@1157: auto_ptr uz; klao@1157: public: klao@1157: klao@1157: // boost::shared_ptr uz; klao@1157: klao@1157: Ex(const Ex &e) : Parent(e), uz(e.uz) {} klao@1157: klao@1157: explicit klao@1157: Ex(const char *msg = 0) { klao@1157: if( msg ) { klao@1157: try { klao@1157: uz.reset(new string); klao@1157: *uz = msg; klao@1157: } klao@1157: catch(...) { klao@1157: uz.reset(); klao@1157: } klao@1157: } klao@1157: } klao@1157: klao@1157: virtual klao@1157: const char* what() const throw() { klao@1157: if( uz.get() ) klao@1157: return uz->c_str(); klao@1157: return "Kivetel"; klao@1157: } klao@1157: klao@1157: virtual ~Ex() throw() {} klao@1157: }; klao@1157: klao@1157: static void fn1() { klao@1157: Ex e("alma"); klao@1157: throw e; klao@1157: } klao@1157: klao@1157: static klao@1157: void fn2() { klao@1157: throw Ex("korte"); klao@1157: } klao@1157: klao@1157: int main() { klao@1157: try { klao@1157: fn1(); klao@1157: } klao@1157: catch(exception const &e) { klao@1157: cerr << "Hiba: " << e.what() << endl; klao@1157: } klao@1157: klao@1157: try { klao@1157: fn2(); klao@1157: } klao@1157: catch(exception const &e) { klao@1157: cerr << "Hiba: " << e.what() << endl; klao@1157: } klao@1157: klao@1157: }