You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.4 KiB
83 lines
2.4 KiB
#ifndef MARISA_EXCEPTION_H_
|
|
#define MARISA_EXCEPTION_H_
|
|
|
|
#include <exception>
|
|
|
|
#include "marisa/base.h"
|
|
|
|
namespace marisa {
|
|
|
|
// An exception object keeps a filename, a line number, an error code and an
|
|
// error message. The message format is as follows:
|
|
// "__FILE__:__LINE__: error_code: error_message"
|
|
class Exception : public std::exception {
|
|
public:
|
|
Exception(const char *filename, int line,
|
|
ErrorCode error_code, const char *error_message)
|
|
: std::exception(), filename_(filename), line_(line),
|
|
error_code_(error_code), error_message_(error_message) {}
|
|
Exception(const Exception &ex)
|
|
: std::exception(), filename_(ex.filename_), line_(ex.line_),
|
|
error_code_(ex.error_code_), error_message_(ex.error_message_) {}
|
|
virtual ~Exception() throw() {}
|
|
|
|
Exception &operator=(const Exception &rhs) {
|
|
filename_ = rhs.filename_;
|
|
line_ = rhs.line_;
|
|
error_code_ = rhs.error_code_;
|
|
error_message_ = rhs.error_message_;
|
|
return *this;
|
|
}
|
|
|
|
const char *filename() const {
|
|
return filename_;
|
|
}
|
|
int line() const {
|
|
return line_;
|
|
}
|
|
ErrorCode error_code() const {
|
|
return error_code_;
|
|
}
|
|
const char *error_message() const {
|
|
return error_message_;
|
|
}
|
|
|
|
virtual const char *what() const throw() {
|
|
return error_message_;
|
|
}
|
|
|
|
private:
|
|
const char *filename_;
|
|
int line_;
|
|
ErrorCode error_code_;
|
|
const char *error_message_;
|
|
};
|
|
|
|
// These macros are used to convert a line number to a string constant.
|
|
#define MARISA_INT_TO_STR(value) #value
|
|
#define MARISA_LINE_TO_STR(line) MARISA_INT_TO_STR(line)
|
|
#define MARISA_LINE_STR MARISA_LINE_TO_STR(__LINE__)
|
|
|
|
// MARISA_THROW throws an exception with a filename, a line number, an error
|
|
// code and an error message. The message format is as follows:
|
|
// "__FILE__:__LINE__: error_code: error_message"
|
|
#define MARISA_THROW(error_code, error_message) \
|
|
(throw marisa::Exception(__FILE__, __LINE__, error_code, \
|
|
__FILE__ ":" MARISA_LINE_STR ": " #error_code ": " error_message))
|
|
|
|
// MARISA_THROW_IF throws an exception if `condition' is true.
|
|
#define MARISA_THROW_IF(condition, error_code) \
|
|
(void)((!(condition)) || (MARISA_THROW(error_code, #condition), 0))
|
|
|
|
// MARISA_DEBUG_IF is ignored if _DEBUG is undefined. So, it is useful for
|
|
// debugging time-critical codes.
|
|
#ifdef _DEBUG
|
|
#define MARISA_DEBUG_IF(cond, error_code) MARISA_THROW_IF(cond, error_code)
|
|
#else
|
|
#define MARISA_DEBUG_IF(cond, error_code)
|
|
#endif
|
|
|
|
} // namespace marisa
|
|
|
|
#endif // MARISA_EXCEPTION_H_
|