src/hugo/error.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 822 88226d9fe821
parent 508 95f8f7171bae
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
klao@489
     1
// -*- C++ -*- //
klao@489
     2
klao@489
     3
#ifndef HUGO_ERROR_H
klao@489
     4
#define HUGO_ERROR_H
klao@489
     5
klao@491
     6
//! \ingroup misc
klao@489
     7
//! \file
klao@489
     8
//! \brief Basic error handling (signaling) routines.
klao@489
     9
klao@490
    10
#include <exception>
klao@489
    11
#include <string>
klao@489
    12
#include <sstream>
klao@489
    13
klao@489
    14
klao@489
    15
namespace hugo {
klao@489
    16
klao@489
    17
  /**
klao@489
    18
   * \brief Generic exception class.
klao@489
    19
   *
klao@489
    20
   * \todo Do we need this?
klao@489
    21
   *
klao@489
    22
   * \todo Don't we need different kind of exceptions for different kind
klao@489
    23
   * of errors?
alpar@508
    24
   * Shouldn't we use \<stdexcept\> instead?
klao@489
    25
   */
klao@489
    26
  class Exception : public std::exception {
klao@489
    27
  protected:
klao@489
    28
    std::ostringstream buf;
klao@489
    29
  public:
klao@489
    30
    Exception() {}
klao@489
    31
    explicit Exception(const std::string &s) { buf << s; }
klao@490
    32
    Exception(const Exception &e) : std::exception() {
klao@490
    33
      buf << e.buf.str();
klao@490
    34
    }
klao@489
    35
    virtual ~Exception() throw() {}
klao@489
    36
    
klao@489
    37
    virtual const char* what() const throw() {
klao@489
    38
      return buf.str().c_str();
klao@489
    39
    }
klao@489
    40
klao@489
    41
    Exception& operator<<(std::string const& s) { buf << s; return *this; }
klao@489
    42
    Exception& operator<<(char const *s) { buf << s; return *this; }
klao@489
    43
    Exception& operator<<(int i) { buf << i; return *this; }
klao@489
    44
  };
klao@489
    45
klao@489
    46
  /**
klao@489
    47
   * \brief Generic error signaling function.
klao@489
    48
   *
klao@489
    49
   * \todo Do we really need this? Is it helpful?
klao@489
    50
   */
klao@489
    51
  inline void fault(const std::string &msg) {
klao@489
    52
    throw Exception(msg);
klao@489
    53
  }
klao@489
    54
klao@489
    55
  /**
klao@489
    56
   * \brief Macro for mark not yet implemented features.
klao@489
    57
   *
klao@489
    58
   * \todo Is this the right place for this? It should be used only in
klao@489
    59
   * modules under development.
klao@489
    60
   */
klao@489
    61
klao@489
    62
# define FIXME(msg) \
klao@490
    63
    do { throw ::hugo::Exception() << "FIXME: " msg " (in: "    \
klao@490
    64
      __FILE__ ", " << __LINE__ << ")";                         \
klao@489
    65
    } while(false)
klao@489
    66
klao@489
    67
}
klao@489
    68
#endif // HUGO_ERROR_H