lemon/error.h
author Balazs Dezso <deba@inf.elte.hu>
Tue, 30 Sep 2008 20:53:18 +0200
changeset 290 f6899946c1ac
parent 280 e7f8647ce760
child 291 d901321d6555
permissions -rw-r--r--
Simplifying exceptions

- Using asserts instead of exceptions for unitialized parameters
- Only the IO exceptions are used in the lemon
- DataFormatError is renamed to FormatError
- The IoError is used for file access errors
alpar@209
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
kpeter@66
     2
 *
alpar@209
     3
 * This file is a part of LEMON, a generic C++ optimization library.
kpeter@66
     4
 *
kpeter@66
     5
 * Copyright (C) 2003-2008
kpeter@66
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
kpeter@66
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
kpeter@66
     8
 *
kpeter@66
     9
 * Permission to use, modify and distribute this software is granted
kpeter@66
    10
 * provided that this copyright notice appears in all copies. For
kpeter@66
    11
 * precise terms see the accompanying LICENSE file.
kpeter@66
    12
 *
kpeter@66
    13
 * This software is provided "AS IS" with no warranty of any kind,
kpeter@66
    14
 * express or implied, and with no claim as to its suitability for any
kpeter@66
    15
 * purpose.
kpeter@66
    16
 *
kpeter@66
    17
 */
kpeter@66
    18
kpeter@66
    19
#ifndef LEMON_ERROR_H
kpeter@66
    20
#define LEMON_ERROR_H
kpeter@66
    21
kpeter@66
    22
/// \ingroup exceptions
kpeter@66
    23
/// \file
kpeter@66
    24
/// \brief Basic exception classes and error handling.
kpeter@66
    25
kpeter@66
    26
#include <exception>
kpeter@66
    27
#include <string>
kpeter@66
    28
#include <sstream>
kpeter@66
    29
#include <iostream>
kpeter@66
    30
#include <cstdlib>
kpeter@66
    31
#include <memory>
kpeter@66
    32
kpeter@66
    33
namespace lemon {
kpeter@66
    34
kpeter@66
    35
  /// \addtogroup exceptions
kpeter@66
    36
  /// @{
kpeter@66
    37
deba@290
    38
  /// \brief Generic exception class.
kpeter@66
    39
  ///
kpeter@66
    40
  /// Base class for exceptions used in LEMON.
kpeter@66
    41
  ///
kpeter@66
    42
  class Exception : public std::exception {
kpeter@66
    43
  public:
deba@290
    44
    ///\e Constructor
kpeter@66
    45
    Exception() {}
deba@290
    46
    ///\e Virtual destructor
kpeter@66
    47
    virtual ~Exception() throw() {}
deba@290
    48
    ///\e A short description of the exception
kpeter@66
    49
    virtual const char* what() const throw() {
kpeter@66
    50
      return "lemon::Exception";
kpeter@66
    51
    }
kpeter@66
    52
  };
kpeter@66
    53
deba@290
    54
  /// \brief Input-Output error
deba@290
    55
  ///
deba@290
    56
  /// This exception is thrown when a file operation cannot be
deba@290
    57
  /// succeeded.
deba@290
    58
  class IoError : public Exception {
deba@290
    59
  protected:
deba@290
    60
    std::string _message;
deba@290
    61
    std::string _file;
kpeter@66
    62
deba@290
    63
    mutable std::string _what;
kpeter@66
    64
  public:
deba@290
    65
deba@290
    66
    /// Copy constructor
deba@290
    67
    IoError(const IoError &error) {
deba@290
    68
      message(error._message);
deba@290
    69
      file(error._file);
deba@290
    70
    }
deba@290
    71
deba@290
    72
    /// Constructor
deba@290
    73
    explicit IoError(const char *message) {
deba@290
    74
      IoError::message(message);
deba@290
    75
    }
deba@290
    76
deba@290
    77
    /// Constructor
deba@290
    78
    explicit IoError(const std::string &message) {
deba@290
    79
      IoError::message(message);
deba@290
    80
    }
deba@290
    81
deba@290
    82
    /// Constructor
deba@290
    83
    IoError(const std::string &file, const char *message) {
deba@290
    84
      IoError::message(message);
deba@290
    85
      IoError::file(file);
deba@290
    86
    }
deba@290
    87
deba@290
    88
    /// Constructor
deba@290
    89
    IoError(const std::string &file, const std::string &message) {
deba@290
    90
      IoError::message(message);
deba@290
    91
      IoError::file(file);
deba@290
    92
    }
deba@290
    93
deba@290
    94
    /// Virtual destructor
deba@290
    95
    virtual ~IoError() throw() {}
deba@290
    96
deba@290
    97
    /// Set the error message
deba@290
    98
    void message(const char *message) {
deba@290
    99
      try {
deba@290
   100
        _message = message;
deba@290
   101
      } catch (...) {}
deba@290
   102
    }
deba@290
   103
deba@290
   104
    /// Set the error message
deba@290
   105
    void message(const std::string& message) {
deba@290
   106
      try {
deba@290
   107
        _message = message;
deba@290
   108
      } catch (...) {}
deba@290
   109
    }
deba@290
   110
deba@290
   111
    /// Set the file name
deba@290
   112
    void file(const std::string &file) {
deba@290
   113
      try {
deba@290
   114
        _file = file;
deba@290
   115
      } catch (...) {}
deba@290
   116
    }
deba@290
   117
deba@290
   118
    /// Returns the error message
deba@290
   119
    const std::string& message() const {
deba@290
   120
      return _message;
deba@290
   121
    }
deba@290
   122
deba@290
   123
    /// \brief Returns the filename
deba@290
   124
    ///
deba@290
   125
    /// Returns the filename or empty string if the filename was not
deba@290
   126
    /// specified.
deba@290
   127
    const std::string& file() const {
deba@290
   128
      return _file;
deba@290
   129
    }
deba@290
   130
deba@290
   131
    /// \brief Returns a short error message
deba@290
   132
    ///
deba@290
   133
    /// Returns a short error message which contains the message, the
deba@290
   134
    /// file name and the line number.
kpeter@66
   135
    virtual const char* what() const throw() {
deba@290
   136
      try {
deba@290
   137
        _what.clear();
deba@290
   138
        std::ostringstream oss;
deba@290
   139
        oss << "lemon:IoError" << ": ";
deba@290
   140
        oss << message();
deba@290
   141
        if (!file().empty()) {
deba@290
   142
          oss << " (";
deba@290
   143
          if (!file().empty()) oss << "with file '" << file() << "'";
deba@290
   144
          oss << ")";
deba@290
   145
        }
deba@290
   146
        _what = oss.str();
deba@290
   147
      }
deba@290
   148
      catch (...) {}
deba@290
   149
      if (!_what.empty()) return _what.c_str();
deba@290
   150
      else return "lemon:IoError";
kpeter@66
   151
    }
deba@290
   152
kpeter@66
   153
  };
kpeter@66
   154
deba@290
   155
  /// \brief Format error
deba@290
   156
  ///
deba@290
   157
  /// This class is used to indicate if an input file has wrong
deba@290
   158
  /// formatting, or a data representation is not legal.
deba@290
   159
  class FormatError : public Exception {
kpeter@66
   160
  protected:
deba@290
   161
    std::string _message;
deba@290
   162
    std::string _file;
kpeter@66
   163
    int _line;
kpeter@66
   164
deba@290
   165
    mutable std::string _what;
kpeter@66
   166
  public:
kpeter@66
   167
deba@290
   168
    /// Copy constructor
deba@290
   169
    FormatError(const FormatError &error) {
deba@290
   170
      message(error._message);
deba@290
   171
      file(error._file);
deba@290
   172
      line(error._line);
kpeter@66
   173
    }
kpeter@66
   174
deba@290
   175
    /// Constructor
deba@290
   176
    explicit FormatError(const char *message) {
deba@290
   177
      FormatError::message(message);
deba@290
   178
      _line = 0;
kpeter@66
   179
    }
kpeter@66
   180
deba@290
   181
    /// Constructor
deba@290
   182
    explicit FormatError(const std::string &message) {
deba@290
   183
      FormatError::message(message);
deba@290
   184
      _line = 0;
deba@290
   185
    }
deba@290
   186
deba@290
   187
    /// Constructor
deba@290
   188
    FormatError(const std::string &file, int line, const char *message) {
deba@290
   189
      FormatError::message(message);
deba@290
   190
      FormatError::file(file);
deba@290
   191
      FormatError::line(line);
deba@290
   192
    }
deba@290
   193
deba@290
   194
    /// Constructor
deba@290
   195
    FormatError(const std::string &file, int line, const std::string &message) {
deba@290
   196
      FormatError::message(message);
deba@290
   197
      FormatError::file(file);
deba@290
   198
      FormatError::line(line);
deba@290
   199
    }
deba@290
   200
deba@290
   201
    /// Virtual destructor
deba@290
   202
    virtual ~FormatError() throw() {}
deba@290
   203
deba@290
   204
    /// Set the line number
deba@290
   205
    void line(int line) { _line = line; }
deba@290
   206
deba@290
   207
    /// Set the error message
deba@290
   208
    void message(const char *message) {
deba@290
   209
      try {
deba@290
   210
        _message = message;
deba@290
   211
      } catch (...) {}
deba@290
   212
    }
deba@290
   213
deba@290
   214
    /// Set the error message
deba@290
   215
    void message(const std::string& message) {
deba@290
   216
      try {
deba@290
   217
        _message = message;
deba@290
   218
      } catch (...) {}
deba@290
   219
    }
deba@290
   220
deba@290
   221
    /// Set the file name
deba@290
   222
    void file(const std::string &file) {
deba@290
   223
      try {
deba@290
   224
        _file = file;
deba@290
   225
      } catch (...) {}
deba@290
   226
    }
deba@290
   227
deba@290
   228
    /// \brief Returns the line number
deba@290
   229
    ///
deba@290
   230
    /// Returns the line number or zero if it was not specified.
deba@290
   231
    int line() const { return _line; }
deba@290
   232
deba@290
   233
    /// Returns the error message
deba@290
   234
    const std::string& message() const {
deba@290
   235
      return _message;
deba@290
   236
    }
deba@290
   237
deba@290
   238
    /// \brief Returns the filename
deba@290
   239
    ///
deba@290
   240
    /// Returns the filename or empty string if the filename was not
deba@290
   241
    /// specified.
deba@290
   242
    const std::string& file() const {
deba@290
   243
      return _file;
deba@290
   244
    }
deba@290
   245
deba@290
   246
    /// \brief Returns a short error message
deba@290
   247
    ///
deba@290
   248
    /// Returns a short error message which contains the message, the
deba@290
   249
    /// file name and the line number.
kpeter@66
   250
    virtual const char* what() const throw() {
kpeter@66
   251
      try {
deba@290
   252
        _what.clear();
deba@290
   253
        std::ostringstream oss;
deba@290
   254
        oss << "lemon:FormatError" << ": ";
deba@290
   255
        oss << message();
deba@290
   256
        if (!file().empty() || line() != 0) {
deba@290
   257
          oss << " (";
deba@290
   258
          if (!file().empty()) oss << "in file '" << file() << "'";
deba@290
   259
          if (!file().empty() && line() != 0) oss << " ";
deba@290
   260
          if (line() != 0) oss << "at line " << line();
deba@290
   261
          oss << ")";
alpar@209
   262
        }
deba@290
   263
        _what = oss.str();
kpeter@66
   264
      }
kpeter@66
   265
      catch (...) {}
deba@290
   266
      if (!_what.empty()) return _what.c_str();
deba@290
   267
      else return "lemon:FormatError";
kpeter@66
   268
    }
kpeter@66
   269
kpeter@66
   270
  };
kpeter@66
   271
deba@108
   272
  /// @}
kpeter@66
   273
kpeter@66
   274
}
deba@108
   275
kpeter@66
   276
#endif // LEMON_ERROR_H