The Gaudi Framework  v30r3 (a5ef0a68)
GaudiException.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_GAUDIEXCEPTION_H
2 #define GAUDIKERNEL_GAUDIEXCEPTION_H
3 
4 // Include files
5 #include "GaudiKernel/Kernel.h"
8 #include "GaudiKernel/System.h"
9 
10 #include <exception>
11 #include <iostream>
12 #include <string>
13 
22 class GAUDI_API GaudiException : virtual public std::exception
23 {
24  // friends
25  friend inline std::ostream& operator<<( std::ostream& os, const GaudiException& ge );
26  friend inline std::ostream& operator<<( std::ostream& os, const GaudiException* pge );
27  friend inline MsgStream& operator<<( MsgStream& os, const GaudiException& ge );
28  friend inline MsgStream& operator<<( MsgStream& os, const GaudiException* pge );
29  friend class StatusCode;
30 
31 public:
38  : m_message( std::move( Message ) ), m_tag( std::move( Tag ) ), m_code( std::move( Code ) )
39  {
40  s_proc = true;
41  }
42 
50  : m_message( std::move( Message ) )
51  , m_tag( std::move( Tag ) )
52  , m_code( std::move( Code ) )
53  , m_previous( Exception.clone() )
54  {
55  }
56 
64  : m_message( std::move( Message ) ), m_tag( std::move( Tag ) ), m_code( std::move( Code ) )
65  {
66  s_proc = true;
67  m_message += ": " + System::typeinfoName( typeid( Exception ) ) + ", " + Exception.what();
68  }
69 
71  GaudiException( const GaudiException& Exception )
72  : std::exception( Exception )
73  , m_message{Exception.message()}
74  , m_tag{Exception.tag()}
75  , m_code{Exception.code()}
76  , m_previous{Exception.previous() ? Exception.previous()->clone() : nullptr}
77  {
78  s_proc = true;
79  }
80 
82  virtual ~GaudiException() throw()
83  {
84  m_code.setChecked();
85  s_proc = false;
86  }
87 
90  {
91  m_message = Exception.message();
92  m_tag = Exception.tag();
93  m_code = Exception.code();
94  m_previous.reset( Exception.previous() ? Exception.previous()->clone() : nullptr );
95  return *this;
96  }
97 
99  virtual const std::string& message() const { return m_message; }
100 
102  virtual const std::string& setMessage( const std::string& newMessage )
103  {
104  m_message = newMessage;
105  return message();
106  }
107 
109  virtual const std::string& tag() const { return m_tag; }
110 
112  virtual const std::string& setTag( const std::string& newTag )
113  {
114  m_tag = newTag;
115  return tag();
116  }
117 
119  virtual const StatusCode& code() const { return m_code; }
120 
122  virtual const StatusCode& setCode( const StatusCode& newStatus )
123  {
124  m_code = newStatus;
125  return code();
126  }
127 
129  virtual GaudiException* previous() const { return m_previous.get(); }
130 
132  virtual std::ostream& printOut( std::ostream& os = std::cerr ) const
133  {
134  os << tag() << " \t " << message() << "\t StatusCode=" << code();
135  return ( 0 != previous() ) ? previous()->printOut( os << std::endl ) : os;
136  }
137 
139  virtual MsgStream& printOut( MsgStream& os ) const
140  {
141  os << tag() << " \t " << message() << "\t StatusCode=" << code();
142  return ( 0 != previous() ) ? previous()->printOut( os << endmsg ) : os;
143  }
144 
146  virtual GaudiException* clone() const { return new GaudiException( *this ); }
147 
149  const char* what() const throw() override { return message().c_str(); }
150 
151 protected:
153  mutable std::string m_tag;
154  mutable StatusCode m_code;
156  static bool s_proc;
157 };
158 
160 std::ostream& operator<<( std::ostream& os, const GaudiException& ge ) { return ge.printOut( os ); }
162 {
163  return ( 0 == pge ) ? ( os << " GaudiException* points to NULL!" ) : ( os << *pge );
164 }
165 
167 MsgStream& operator<<( MsgStream& os, const GaudiException& ge ) { return ge.printOut( os ); }
170 {
171  return ( 0 == pge ) ? ( os << " GaudiException* points to NULL!" ) : ( os << *pge );
172 }
173 
174 #endif // GAUDIKERNEL_GAUDIEXCEPTION_H
virtual const std::string & message() const
error message to be printed
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
Define general base for Gaudi exception.
virtual const StatusCode & setCode(const StatusCode &newStatus)
update the status code for the exception
GaudiException(std::string Message, std::string Tag, StatusCode Code, const GaudiException &Exception)
Constructor (2)
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:332
GaudiException & operator=(const GaudiException &Exception)
assignment operator
code_t m_code
The status code value.
Definition: StatusCode.h:244
static bool s_proc
"previous" element in the linked list
virtual const std::string & setMessage(const std::string &newMessage)
update the error message to be printed
T endl(T...args)
STL namespace.
std::ostream & operator<<(std::ostream &os, const GaudiException &ge)
overloaded printout to std::ostream
const char * what() const override
method from std::exception
std::string m_tag
error message
virtual const StatusCode & code() const
StatusCode for Exception.
STL class.
std::string m_message
T what(T...args)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
virtual GaudiException * previous() const
get the previous exception ( "previous" element in the linked list)
virtual GaudiException * clone() const
clone operation
virtual const std::string & tag() const
name tag for the exception, or exception type
GaudiException(std::string Message, std::string Tag, StatusCode Code, const std::exception &Exception)
Constructor (3)
STL class.
virtual MsgStream & printOut(MsgStream &os) const
Output the exception to the Gaudi MsgStream.
The Message class.
Definition: Message.h:15
virtual const std::string & setTag(const std::string &newTag)
update name tag
T c_str(T...args)
virtual std::ostream & printOut(std::ostream &os=std::cerr) const
methods for overloaded printout to std::ostream& and MsgStream&
virtual ~GaudiException()
destructor (perform the deletion of "previous" field!)
StatusCode m_code
exception tag
std::string message() const
Description (or name) of StatusCode value.
Definition: StatusCode.h:183
#define GAUDI_API
Definition: Kernel.h:104
STL class.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
std::unique_ptr< GaudiException > m_previous
status code for exception
GaudiException(const GaudiException &Exception)
Copy constructor (deep copying!)
GaudiException(std::string Message, std::string Tag, StatusCode Code)
Constructor (1)