/* -*- C++ -*- */ /************************************************************************* * Copyright(c) 1995~2005 Masaharu Goto (root-cint@cern.ch) * * For the licensing terms see the file COPYING * ************************************************************************/ // demo/exception/ehdemo.h // This source has to be compiled. Refer to setup #include #include //////////////////////////////////////////////////////////////// // Derive your exception class from std::exception. Then Cint // handles your exception by virtual function call //////////////////////////////////////////////////////////////// class my_exception #ifdef STD : public std::exception #else : public exception #endif { string msg; public: my_exception(const char* x) : msg(x) { } my_exception() : msg("This is my exception") { } my_exception(const my_exception& x) : msg(x.msg) { } my_exception& operator=(const my_exception& x) { msg=x.msg;return(*this); } virtual const char* what() const throw(){ return(msg.c_str()); } virtual ~my_exception() throw() { } }; //////////////////////////////////////////////////////////////// // If you do not derive from std::exception, Cint catches it but // can not distinguish it //////////////////////////////////////////////////////////////// class unhandled_exception { public: unhandled_exception() { } const char* what() const { return("this is not reported"); } ~unhandled_exception() { } }; //////////////////////////////////////////////////////////////// // This compiled function is called by the interpreter //////////////////////////////////////////////////////////////// void test(char* name) { if(!name) throw my_exception("NULL pointer"); if(!name[0]) throw my_exception("Empty string"); if(strcmp(name,"error")==0) #ifdef STD throw std::exception(); #else throw exception(); #endif if(strcmp(name,"unknown")==0) throw unhandled_exception(); printf("%s\n",name); }