00001 #ifndef Utilities_CodedException_h 00002 #define Utilities_CodedException_h 00003 00013 #include "FWCore/Utilities/interface/Exception.h" 00014 00015 #include <string> 00016 #include <map> 00017 00018 #define EDM_MAP_ENTRY(map, ns, name) map[ns::name]=#name 00019 #define EDM_MAP_ENTRY_NONS(map, name) map[name]=#name 00020 00021 namespace edm { 00022 template <class Code> 00023 class CodedException : public cms::Exception 00024 { 00025 public: 00026 explicit CodedException(Code category); 00027 00028 CodedException(Code category, 00029 const std::string& message); 00030 00031 CodedException(Code category, 00032 const std::string& message, 00033 const cms::Exception& another); 00034 00035 CodedException(const CodedException& other); 00036 00037 virtual ~CodedException() throw(); 00038 00039 Code categoryCode() const { return category_; } 00040 00041 int returnCode() const { return static_cast<int>(category_); } 00042 00043 static std::string codeToString(Code); 00044 00045 typedef std::map<Code,std::string> CodeMap; 00046 private: 00047 00048 Code category_; 00049 }; 00050 00051 00053 00054 #if 0 00055 template <class Code> 00056 void CodedException<Code>::loadTable() { } 00057 #endif 00058 00059 template <class Code> 00060 std::string CodedException<Code>::codeToString(Code c) 00061 { 00062 extern void getCodeTable(CodeMap*&); 00063 CodeMap* trans; 00064 getCodeTable(trans); 00065 typename CodeMap::const_iterator i(trans->find(c)); 00066 return i!=trans->end() ? i->second : std::string("UnknownCode"); 00067 } 00068 00069 00070 template <class Code> 00071 CodedException<Code>::CodedException(Code aCategory): 00072 cms::Exception(codeToString(aCategory)), 00073 category_(aCategory) 00074 { 00075 } 00076 00077 template <class Code> 00078 CodedException<Code>::CodedException(Code aCategory, 00079 const std::string& message): 00080 cms::Exception(codeToString(aCategory),message), 00081 category_(aCategory) 00082 { 00083 } 00084 00085 template <class Code> 00086 CodedException<Code>::CodedException(Code aCategory, 00087 const std::string& message, 00088 const cms::Exception& another): 00089 cms::Exception(codeToString(aCategory),message,another), 00090 category_(aCategory) 00091 { 00092 } 00093 00094 template <class Code> 00095 CodedException<Code>::CodedException(const CodedException& other): 00096 cms::Exception(other), 00097 category_(other.category_) 00098 { 00099 } 00100 00101 template <class Code> 00102 CodedException<Code>::~CodedException() throw() 00103 { 00104 } 00105 00106 } 00107 00108 #endif