00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_misc_scexception_h
00033 #define _util_misc_scexception_h
00034
00035 #ifndef _util_class_class_h
00036 #include <util/class/class.h>
00037 #endif
00038
00039 #include <stddef.h>
00040 #include <exception>
00041 #include <sstream>
00042 #include <vector>
00043
00044 namespace sc {
00045
00049 class SCException: public std::exception {
00050 const char *description_;
00051 const char *file_;
00052 int line_;
00053 const ClassDesc* class_desc_;
00054 const char *exception_type_;
00055 std::ostringstream *elaboration_;
00056
00057 public:
00058 SCException(const char *description = 0,
00059 const char *file = 0,
00060 int line = 0,
00061 const ClassDesc *class_desc = 0,
00062 const char *exception_type = "SCException") throw();
00063 SCException(const SCException&) throw();
00064 ~SCException() throw();
00065
00068 const char* what() const throw();
00069
00070 const char *description() const throw() { return description_; }
00071 const char *file() const throw() { return file_; }
00072 int line() const throw() { return line_; }
00073 const ClassDesc *class_desc() const throw() { return class_desc_; }
00074 const char *exception_type() const throw() { return exception_type_; }
00075
00079 std::ostream &elaborate();
00080 };
00081
00082
00083
00084
00087 class ProgrammingError: public SCException {
00088
00089 public:
00090 ProgrammingError(const char *description = 0,
00091 const char *file = 0,
00092 int line = 0,
00093 const ClassDesc *class_desc = 0,
00094 const char *exception_type = "ProgrammingError") throw();
00095 ProgrammingError(const ProgrammingError&) throw();
00096 ~ProgrammingError() throw();
00097 };
00098
00102 class FeatureNotImplemented: public ProgrammingError {
00103
00104 public:
00105 FeatureNotImplemented(const char *description = 0,
00106 const char *file = 0,
00107 int line = 0,
00108 const ClassDesc *class_desc = 0,
00109 const char *exception_type = "FeatureNotImplemented")
00110 throw();
00111 FeatureNotImplemented(const FeatureNotImplemented&) throw();
00112 ~FeatureNotImplemented() throw();
00113 };
00114
00115
00116
00117
00122 class InputError: public SCException {
00123 const char *keyword_;
00124 char *value_;
00125
00126 public:
00127 InputError(const char *description = 0,
00128 const char *file = 0,
00129 int line = 0,
00130 const char *keyword = 0,
00131 const char *value = 0,
00132 const ClassDesc *class_desc = 0,
00133 const char *exception_type = "InputError") throw();
00134 InputError(const InputError&) throw();
00135 ~InputError() throw();
00136 const char *keyword() const throw() { return keyword_; }
00137 const char *value() const throw() { return value_; }
00138 };
00139
00140
00141
00142
00145 class SystemException: public SCException {
00146
00147 public:
00148 SystemException(const char *description = 0,
00149 const char *file = 0,
00150 int line = 0,
00151 const ClassDesc *class_desc = 0,
00152 const char *exception_type = "SystemException") throw();
00153 SystemException(const SystemException&) throw();
00154 ~SystemException() throw();
00155 };
00156
00159 class MemAllocFailed: public SystemException {
00160 size_t nbyte_;
00161
00162 public:
00163 MemAllocFailed(const char *description = 0,
00164 const char *file = 0,
00165 int line = 0,
00166 size_t nbyte = 0,
00167 const ClassDesc *class_desc = 0,
00168 const char *exception_type = "MemAllocFailed") throw();
00169 MemAllocFailed(const MemAllocFailed&) throw();
00170 ~MemAllocFailed() throw();
00171
00173 size_t nbyte() const throw() { return nbyte_; }
00174 };
00175
00178 class FileOperationFailed: public SystemException {
00179 public:
00180 enum FileOperation { Unknown, OpenR, OpenW, OpenRW,
00181 Close, Read, Write, Corrupt, Other };
00182
00183 private:
00184 const char *filename_;
00185 FileOperation operation_;
00186
00187 public:
00188 FileOperationFailed(const char *description = 0,
00189 const char *source_file = 0,
00190 int line = 0,
00191 const char *filename = 0,
00192 FileOperation operation = Unknown,
00193 const ClassDesc *class_desc = 0,
00194 const char *exception_type = "FileOperationFailed") throw();
00195 FileOperationFailed(const FileOperationFailed&) throw();
00196 ~FileOperationFailed() throw();
00197
00200 const char * filename() const throw() { return filename_; }
00201 FileOperation operation() const throw() { return operation_; }
00202 };
00203
00206 class SyscallFailed: public SystemException {
00207 const char *syscall_;
00208 int err_;
00209
00210 public:
00211 SyscallFailed(const char *description = 0,
00212 const char *source_file = 0,
00213 int line = 0,
00214 const char *syscall = 0,
00215 int err = 0,
00216 const ClassDesc *class_desc = 0,
00217 const char *exception_type = "SyscallFailed") throw();
00218 SyscallFailed(const SyscallFailed&) throw();
00219 ~SyscallFailed() throw();
00220
00223 const char * syscall() const throw() { return syscall_; }
00224 int err() const throw() { return err_; }
00225 };
00226
00227
00228
00229
00233 class AlgorithmException: public SCException {
00234
00235 public:
00236 AlgorithmException(const char *description = 0,
00237 const char *file = 0,
00238 int line = 0,
00239 const ClassDesc *class_desc = 0,
00240 const char *exception_type = "AlgorithmException")
00241 throw();
00242 AlgorithmException(const AlgorithmException&) throw();
00243 ~AlgorithmException() throw();
00244 };
00245
00249 class MaxIterExceeded: public AlgorithmException {
00250 int max_iter_;
00251
00252 public:
00253 MaxIterExceeded(const char *description = 0,
00254 const char *file = 0,
00255 int line = 0,
00256 int maxiter = 0,
00257 const ClassDesc *class_desc = 0,
00258 const char *exception_type = "MaxIterExceeded") throw();
00259 MaxIterExceeded(const MaxIterExceeded&) throw();
00260 ~MaxIterExceeded() throw();
00261
00262 int max_iter() const throw() { return max_iter_; }
00263 };
00264
00267 class ToleranceExceeded: public AlgorithmException {
00268 double tolerance_;
00269 double value_;
00270
00271 public:
00272 ToleranceExceeded(const char *description = 0,
00273 const char *file = 0,
00274 int line = 0,
00275 double tol=0,
00276 double val=0,
00277 const ClassDesc *class_desc = 0,
00278 const char *exception_type = "ToleranceExceeded") throw();
00279 ToleranceExceeded(const ToleranceExceeded&) throw();
00280 ~ToleranceExceeded() throw();
00281 double tolerance() throw() { return tolerance_; }
00282 double value() throw() { return value_; }
00283 };
00284
00285
00286
00287
00292 template <class T>
00293 class LimitExceeded: public SCException {
00294 T limit_;
00295 T value_;
00296
00297 public:
00298 LimitExceeded(const char *description,
00299 const char *file,
00300 int line,
00301 T lim,
00302 T val,
00303 const ClassDesc *class_desc = 0,
00304 const char *exception_type = "LimitExceeded") throw():
00305 SCException(description, file, line, class_desc, exception_type),
00306 limit_(lim), value_(val)
00307 {
00308 try {
00309 elaborate() << "value: " << value_
00310 << std::endl
00311 << "limit: " << limit_
00312 << std::endl;
00313 }
00314 catch(...) {
00315 }
00316 }
00317 LimitExceeded(const LimitExceeded&ref) throw():
00318 SCException(ref),
00319 limit_(ref.limit_), value_(ref.value_)
00320 {
00321 }
00322 ~LimitExceeded() throw() {}
00323 T tolerance() throw() { return limit_; }
00324 T value() throw() { return value_; }
00325 };
00326
00327 }
00328
00329 #endif
00330