00001 #ifndef EXCEPTION_H
00002 #define EXCEPTION_H
00003
00004 #pragma interface
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <string>
00027 #include <tagcoll/stringf.h>
00028
00076
00077
00085 void DefaultUnexpected();
00086
00089 class InstallUnexpected
00090 {
00091 protected:
00092 void (*old)();
00093 public:
00094 InstallUnexpected(void (*func)() = DefaultUnexpected);
00095 ~InstallUnexpected();
00096 };
00097
00099
00105 class Exception
00106 {
00107 public:
00108 Exception() throw () {}
00109 virtual ~Exception() throw () {}
00110 Exception(const Exception& e) throw () {}
00111
00113 virtual const char* type() const throw () { return "Exception"; }
00114
00116 virtual std::string desc() const throw () { return type(); }
00117 };
00118
00120 class ContextException : public Exception
00121 {
00122 protected:
00123 std::string _context;
00124
00125 public:
00130 ContextException(const std::string& context) throw () : _context(context) {};
00131 ~ContextException() throw () {}
00132
00133 virtual const char* type() const throw () { return "ContextException"; }
00134
00135 virtual std::string desc() const throw () { return _context; }
00136
00137 virtual std::string context() const throw () { return _context; }
00138 };
00139
00142
00148 class InterruptedException : public ContextException
00149 {
00150 public:
00151 InterruptedException(const std::string& context) throw () :
00152 ContextException(context) {}
00153
00154 virtual const char* type() const throw ()
00155 {
00156 return "InterruptedException";
00157 }
00158 };
00159
00161
00168 class WaitInterruptedException : public InterruptedException
00169 {
00170 public:
00171 WaitInterruptedException(const std::string& context) throw () :
00172 InterruptedException(context) {}
00173
00174 virtual const char* type() const throw ()
00175 {
00176 return "WaitInterruptedException";
00177 }
00178 };
00179
00181
00184 class ConsistencyCheckException : public ContextException
00185 {
00186 public:
00187 ConsistencyCheckException(const std::string& context) throw () :
00188 ContextException(context) {}
00189
00190 virtual const char* type() const throw ()
00191 {
00192 return "ConsistencyCheckException";
00193 }
00194 };
00195
00196 class OutOfRangeException : public ConsistencyCheckException
00197 {
00198 protected:
00199 std::string _var_desc;
00200
00201 public:
00202 OutOfRangeException(const std::string& context, const std::string& var_desc) throw ()
00203 : ConsistencyCheckException(context), _var_desc(var_desc) {}
00204 ~OutOfRangeException() throw () {}
00205
00206 virtual const char* type() const throw ()
00207 {
00208 return "ConsistencyCheckException";
00209 }
00210
00212 virtual std::string var_desc() const throw () { return _var_desc; }
00213
00214 virtual std::string desc() const throw ()
00215 {
00216 return _var_desc + " out of range " + _context;
00217 }
00218 };
00219
00221
00237 template <class C>
00238 class ValOutOfRangeException : public OutOfRangeException
00239 {
00240 protected:
00241 C _val;
00242 C _inf;
00243 C _sup;
00244
00245 public:
00249 ValOutOfRangeException(const std::string& context, const std::string& var_desc,
00250 C val, C inf, C sup) throw ()
00251 : OutOfRangeException(context, var_desc),
00252 _val(val), _inf(inf), _sup(sup) {}
00253
00255
00256
00257 virtual C val() const throw () { return _val; }
00259 virtual C inf() const throw () { return _inf; }
00261 virtual C sup() const throw () { return _sup; }
00263
00264 virtual const char* type() const throw ()
00265 {
00266 return "ValOutOfRangeException<>";
00267 }
00268
00269 virtual std::string desc() const throw ()
00270 {
00271 return _var_desc + "(" + stringf::fmt(_val) + ") out of range (" +
00272 stringf::fmt(_inf) + "-" + stringf::fmt(_sup) + ") " + _context;
00273 }
00274 };
00275
00277
00294 class SystemException : public ContextException
00295 {
00296 protected:
00297 int _code;
00298
00299 public:
00300 SystemException(int code, const std::string& context) throw () :
00301 ContextException(context), _code(code) {}
00302
00303 virtual const char* type() const throw () { return "SystemException"; }
00304
00306 virtual int code() const throw () { return _code; }
00307
00309 virtual std::string system_desc() const throw ();
00310
00311 virtual std::string desc() const throw ()
00312 {
00313 return system_desc() + " " + _context;
00314 }
00315 };
00316
00318
00323 class FileException : public SystemException
00324 {
00325 public:
00326 FileException(int code, const std::string& context) throw () :
00327 SystemException(code, context) {}
00328
00329 virtual const char* type() const throw () { return "FileException"; }
00330 };
00331
00332
00333 #endif