00001 /*****************************************************************************/ 00002 /*! 00003 * \file exception.h 00004 * 00005 * Author: Sergey Berezin 00006 * 00007 * Created: Thu Feb 6 13:09:44 2003 00008 * 00009 * <hr> 00010 * 00011 * License to use, copy, modify, sell and/or distribute this software 00012 * and its documentation for any purpose is hereby granted without 00013 * royalty, subject to the terms and conditions defined in the \ref 00014 * LICENSE file provided with this distribution. 00015 * 00016 * <hr> 00017 * 00018 * A generic exception. Any thrown exception must inherit from this 00019 * class and whenever possible, set the error message. 00020 */ 00021 /*****************************************************************************/ 00022 00023 #ifndef _cvc3__exception_h_ 00024 #define _cvc3__exception_h_ 00025 00026 #include <string> 00027 #include <iostream> 00028 00029 namespace CVC3 { 00030 00031 class Exception { 00032 protected: 00033 std::string d_msg; 00034 public: 00035 // Constructors 00036 Exception(): d_msg("Unknown exception") { } 00037 Exception(const std::string& msg): d_msg(msg) { } 00038 Exception(const char* msg): d_msg(msg) { } 00039 // Destructor 00040 virtual ~Exception() { } 00041 // NON-VIRTUAL METHODs for setting and printing the error message 00042 void setMessage(const std::string& msg) { d_msg = msg; } 00043 // Printing: feel free to redefine toString(). When inherited, 00044 // it's recommended that this method print the type of exception 00045 // before the actual message. 00046 virtual std::string toString() const { return d_msg; } 00047 // No need to overload operator<< for the inherited classes 00048 friend std::ostream& operator<<(std::ostream& os, const Exception& e); 00049 00050 }; // end of class Exception 00051 00052 inline std::ostream& operator<<(std::ostream& os, const Exception& e) { 00053 return os << e.toString(); 00054 } 00055 00056 } // end of namespace CVC3 00057 00058 #endif