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