00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _Error_incl_
00021 #define _Error_incl_
00022
00023 #include <stdexcept>
00024 #include <rlog/common.h>
00025
00026 #include <string>
00027
00028 namespace rlog
00029 {
00030 class RLOG_DECL RLogChannel;
00031
00032
00033 class RLOG_DECL Error : public std::runtime_error
00034 {
00035 public:
00036 Error( const char *component, const char *file, const char *function,
00037 int line, const char *msg );
00038 Error( const char *component, const char *file, const char *function,
00039 int line, const std::string &msg );
00040 Error(const Error &src );
00041 virtual ~Error() throw();
00042
00043 Error &operator = (const Error &src);
00044
00045 void log( RLogChannel * channel ) const;
00046
00047 const char *component() const;
00048 const char *file() const;
00049 const char *function() const;
00050 int line() const;
00051 const char *message() const;
00052
00053 private:
00054 struct ErrorData *data;
00055 };
00056
00057 std::string _format_msg( const char *fmt, ... ) PRINTF(1,2);
00058 }
00059
00060 #define _ERROR_IMPL( COMPONENT, MSG ) \
00061 rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, MSG )
00062
00063 #define ERROR( MSG ) _ERROR_IMPL( RLOG_COMPONENT, MSG )
00064
00065 #if C99_VARIADAC_MACROS
00066 #define _ERROR_IMPL_VA( COMPONENT, FMT, ... ) \
00067 rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, \
00068 rlog::_format_msg( FMT, __VA_ARGS__ ) )
00069 #define ERROR_FMT( FMT, ... ) _ERROR_IMPL_VA( RLOG_COMPONENT, FMT, __VA_ARGS__ )
00070 #elif PREC99_VARIADIC_MACROS
00071 #define _ERROR_IMPL_VA( COMPONENT, FMT, ARGS... ) \
00072 rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, \
00073 rlog::_format_msg( FMT, ##ARGS ) )
00074 #define ERROR_FMT( FMT, ARGS... ) _ERROR_IMPL_VA( RLOG_COMPONENT, FMT, ##ARGS )
00075 #else
00076
00077 #endif
00078
00079 #endif
00080