//! See discussion in Saylan, G., "Practical C++ error handling in hybrid environments," Dr. Dobb's Journal, p. 50-55, March 2007.
//! He uses an auto_ptr to track a stringstream. It constructs a string on the fly. RoadError uses the copy constructor to transform RoadLogEvent into a string
class RoadError;
class RoadError : public std::exception {
private:
#//!\name Fields
int error_code; //! Non-zero code (not logged), maybe returned as program status
RoadLogEvent log_event; //! Format string w/ arguments
mutable std::string error_message; //! Formated error message. Must be after log_event.
#//!\name Class fields
static const char * ROADtag;
static std::ostringstream global_log; //! May be replaced with any ostream object
public:
#//!\name Constants
#//!\name Constructors
RoadError();
RoadError(const RoadError &other); //! Called on throw, generates error_message
RoadError(int code, const std::string &message);
RoadError(int code, const char *fmt);
RoadError(int code, const char *fmt, int d);
RoadError(int code, const char *fmt, int d, int d2);
RoadError(int code, const char *fmt, int d, int d2, float f);
RoadError(int code, const char *fmt, int d, int d2, float f, const char *s);
RoadError(int code, const char *fmt, int d, int d2, float f, const void *x);
RoadError(int code, const char *fmt, int d, int d2, float f, int i);
RoadError(int code, const char *fmt, int d, int d2, float f, long long i);
RoadError(int code, const char *fmt, int d, int d2, float f, double e);