#include <GaudiKernel/Guards.h>
Collaboration diagram for Gaudi::Guards::ExceptionGuard:
Public Member Functions | |
template<class OBJECT, class FUNCTION> | |
ExceptionGuard (OBJECT obj, FUNCTION fun, MsgStream &log, IExceptionSvc *svc=0) | |
~ExceptionGuard () | |
destructor | |
const StatusCode & | code () const |
the result of function evaluation | |
operator const StatusCode & () const | |
cast operator, useful for the implict conversions | |
Protected Member Functions | |
void | handle (const GaudiException &e, MsgStream &s) |
local handler of GaudiException | |
void | handle (const std::exception &e, MsgStream &s) |
local handler of std::xception | |
void | handle (MsgStream &s) |
local handler of UNKNOWN exceptions | |
Private Member Functions | |
ExceptionGuard () | |
default constructor is disabled | |
ExceptionGuard (const ExceptionGuard &) | |
no copy | |
ExceptionGuard & | operator= (const ExceptionGuard &) |
no assignement | |
Private Attributes | |
StatusCode | m_sc |
status code : result of function evaluation |
. classes
The usage is fairly trivial:
// get the stream: MsgStream& log = ... ; // create the guard object and execute this->initialize() // within the standard "try"-clause: Gaudi::Guards::Guard guard ( this , std::mem_fun(&IAuditor::initialize) , log ) ; // extract the status code" StatusCode sc = guard.code() ;
The utility could be reused for member-function, regular functions, etc.. It could be easily combined with STL-idioms Essentially it required only the semantical validity of the expression "StatusCode sc = fun(obj)"
Definition at line 108 of file Guards.h.
Gaudi::Guards::ExceptionGuard::ExceptionGuard | ( | OBJECT | obj, | |
FUNCTION | fun, | |||
MsgStream & | log, | |||
IExceptionSvc * | svc = 0 | |||
) | [inline] |
Definition at line 118 of file Guards.h.
00122 : m_sc ( StatusCode::FAILURE ) 00123 { 00124 try 00125 { 00126 // execute the functor: 00127 m_sc = fun ( obj ) ; 00128 // in the case of error try use Exception Service 00129 if ( 0 != svc && m_sc.isFailure() ) { m_sc = svc->handleErr ( *obj , m_sc ) ; } 00130 } 00131 catch ( const GaudiException& e ) 00132 { 00133 // Use the local handler and then (if possible) the Exception Service 00134 handle ( e , log ) ; 00135 if ( 0 != svc ) { m_sc = svc -> handle ( *obj , e ) ; } 00136 } 00137 catch ( const std::exception& e ) 00138 { 00139 // Use the local handler and then (if possible) the Exception Service 00140 handle ( e , log ) ; 00141 if ( 0 != svc ) { m_sc = svc -> handle ( *obj , e ) ; } 00142 } 00143 catch ( ... ) 00144 { 00145 // Use the local handler and then (if possible) the Exception Service 00146 handle ( log ) ; 00147 if ( 0 != svc ) { m_sc = svc -> handle ( *obj ) ; } 00148 } 00149 }
Gaudi::Guards::ExceptionGuard::~ExceptionGuard | ( | ) |
destructor
Gaudi::Guards::ExceptionGuard::ExceptionGuard | ( | ) | [private] |
default constructor is disabled
Gaudi::Guards::ExceptionGuard::ExceptionGuard | ( | const ExceptionGuard & | ) | [private] |
no copy
const StatusCode& Gaudi::Guards::ExceptionGuard::code | ( | ) | const [inline] |
Gaudi::Guards::ExceptionGuard::operator const StatusCode & | ( | ) | const [inline] |
ExceptionGuard& Gaudi::Guards::ExceptionGuard::operator= | ( | const ExceptionGuard & | ) | [private] |
no assignement
void Gaudi::Guards::ExceptionGuard::handle | ( | const GaudiException & | e, | |
MsgStream & | s | |||
) | [protected] |
local handler of GaudiException
void Gaudi::Guards::ExceptionGuard::handle | ( | const std::exception & | e, | |
MsgStream & | s | |||
) | [protected] |
local handler of std::xception
void Gaudi::Guards::ExceptionGuard::handle | ( | MsgStream & | s | ) | [protected] |
local handler of UNKNOWN exceptions