//////////////////////////////////////////////////////////////////////////////// /*! @file Excepts.h Basic classes for specific exception handling. - Part of RANet - Research Assistant Net Library. - Copyright(C) 1994-2017, Viktor E. Bursian, St.Petersburg, Russia. VBursian@gmail.com */////////////////////////////////////////////////////////////////////////////// #ifndef Excepts_H #define Excepts_H #include "General.h" #include "Strings.h" #include namespace RA { //------------------------------------------------------------------------------ ANNOUNCE_CLASS(xException) ANNOUNCE_CLASS(xProgramError) ANNOUNCE_CLASS(xAssertFailed) ANNOUNCE_CLASS(xNotImplemented) //ANNOUNCE_CLASS(xStreamError) #define THROW( exception_class , message_text ) \ throw exception_class ( message_text , __FILE__ , __LINE__ , #exception_class ) #define ASSERT( expr ) \ if( !( bool( expr ) ) ) throw xAssertFailed( #expr , __FILE__ , __LINE__ ) #define ABORT_IF_NOT( expr ) \ if( !( bool( expr ) ) ){ \ std::cerr << "***********************************************\n" \ << "*** ABORTED BECAUSE THE FOLLOWING IS FALSE:\n" \ << "*** " << #expr << "\n" \ << "*** FILE: " << __FILE__ << " LINE: " << __LINE__ << "\n" \ << "***********************************************\n"; \ std::terminate(); \ }; //--------------------------------------------------------------- xException --- class RANet_EXPORT xException : public std::exception { public://static static void Report2cerr (const std::exception &); public: virtual ~xException () {} // xException (rcxException other); xException (rcsString msg_text ,rcsString src_file_name = sString() ,int line_no = 0 ,rcsString class_name = sString("xException") ) :TheFileName(src_file_name) ,TheLineNo(line_no) ,TheClassName(class_name) ,TheMsgText(msg_text) {} xException () :TheLineNo(0) ,TheClassName("xException") {} virtual const char * what () const noexcept override { return (const char *)TheMsgText; } virtual sString MsgText () const { return TheMsgText; } virtual sString WhereText () const; virtual sString SorryText () const; virtual void Report2cerr () const; private: // fields sString TheFileName; int TheLineNo; sString TheClassName; sString TheMsgText; }; //------------------------------------------------------------------------------ class RANet_EXPORT xProgramError : public xException { public: xProgramError (rcsString msg_text ,rcsString src_file_name // = sString() ,int line_no // = 0 ,rcsString class_name = sString("xProgramError") ) :xException(msg_text,src_file_name,line_no ,class_name) {} }; //------------------------------------------------------------------------------ class RANet_EXPORT xAssertFailed : public xProgramError { public: xAssertFailed (literal assertion ,literal src_file_name ,int line_no ); }; //------------------------------------------------------------------------------ class RANet_EXPORT xNotImplemented : public xProgramError { public: xNotImplemented (rcsString what); }; //------------------------------------------------------------------------------ //class RANet_EXPORT xStreamError : public xException //{ // public: // enum eStreamError // {Other}; // xStreamError () // :Code(Other) // {} // xStreamError (eStreamError ACode) // :Code(ACode) // {} // int Code; //}; //------------------------------------------------------------------------------ } //namespace RA #endif