Commit 4c43c7d9 authored by Jelte Jansen's avatar Jelte Jansen

[1857] make other exceptions we define subs of isc::Exception as well

instead of std::exception
parent 373ef178
...@@ -197,6 +197,16 @@ public: ...@@ -197,6 +197,16 @@ public:
throw type(__FILE__, __LINE__, oss__.str().c_str(), param1); \ throw type(__FILE__, __LINE__, oss__.str().c_str(), param1); \
} while (1) } while (1)
///
/// Similar as isc_throw, but allows the exception to have two additional
/// parameters (the stream/text goes first)
#define isc_throw_2(type, stream, param1, param2) \
do { \
std::ostringstream oss__; \
oss__ << stream; \
throw type(__FILE__, __LINE__, oss__.str().c_str(), param1, param2); \
} while (1)
} }
#endif // __EXCEPTIONS_H #endif // __EXCEPTIONS_H
......
...@@ -16,3 +16,4 @@ noinst_PROGRAMS = message ...@@ -16,3 +16,4 @@ noinst_PROGRAMS = message
message_SOURCES = message.cc message_SOURCES = message.cc
message_LDADD = $(top_builddir)/src/lib/log/liblog.la message_LDADD = $(top_builddir)/src/lib/log/liblog.la
message_LDADD += $(top_builddir)/src/lib/util/libutil.la message_LDADD += $(top_builddir)/src/lib/util/libutil.la
message_LDADD += $(top_builddir)/src/lib/exceptions/libexceptions.la
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <exceptions/exceptions.h>
#include <util/filename.h> #include <util/filename.h>
#include <util/strutil.h> #include <util/strutil.h>
...@@ -325,8 +327,8 @@ writeHeaderFile(const string& file, const vector<string>& ns_components, ...@@ -325,8 +327,8 @@ writeHeaderFile(const string& file, const vector<string>& ns_components,
ofstream hfile(header_file.fullName().c_str()); ofstream hfile(header_file.fullName().c_str());
if (hfile.fail()) { if (hfile.fail()) {
throw MessageException(LOG_OPEN_OUTPUT_FAIL, header_file.fullName(), isc_throw_2(MessageException, LOG_OPEN_OUTPUT_FAIL,
strerror(errno)); header_file.fullName(), strerror(errno));
} }
// Write the header preamble. If there is an error, we'll pick it up // Write the header preamble. If there is an error, we'll pick it up
...@@ -359,7 +361,7 @@ writeHeaderFile(const string& file, const vector<string>& ns_components, ...@@ -359,7 +361,7 @@ writeHeaderFile(const string& file, const vector<string>& ns_components,
// Report errors (if any) and exit // Report errors (if any) and exit
if (hfile.fail()) { if (hfile.fail()) {
throw MessageException(LOG_WRITE_ERROR, header_file.fullName(), isc_throw_2(MessageException, LOG_WRITE_ERROR, header_file.fullName(),
strerror(errno)); strerror(errno));
} }
...@@ -425,8 +427,8 @@ writeProgramFile(const string& file, const vector<string>& ns_components, ...@@ -425,8 +427,8 @@ writeProgramFile(const string& file, const vector<string>& ns_components,
ofstream ccfile(program_file.fullName().c_str()); ofstream ccfile(program_file.fullName().c_str());
if (ccfile.fail()) { if (ccfile.fail()) {
throw MessageException(LOG_OPEN_OUTPUT_FAIL, program_file.fullName(), isc_throw_2(MessageException, LOG_OPEN_OUTPUT_FAIL,
strerror(errno)); program_file.fullName(), strerror(errno));
} }
// Write the preamble. If there is an error, we'll pick it up after // Write the preamble. If there is an error, we'll pick it up after
...@@ -483,7 +485,7 @@ writeProgramFile(const string& file, const vector<string>& ns_components, ...@@ -483,7 +485,7 @@ writeProgramFile(const string& file, const vector<string>& ns_components,
// Report errors (if any) and exit // Report errors (if any) and exit
if (ccfile.fail()) { if (ccfile.fail()) {
throw MessageException(LOG_WRITE_ERROR, program_file.fullName(), isc_throw_2(MessageException, LOG_WRITE_ERROR, program_file.fullName(),
strerror(errno)); strerror(errno));
} }
......
...@@ -15,12 +15,14 @@ ...@@ -15,12 +15,14 @@
#ifndef __MESSAGE_EXCEPTION_H #ifndef __MESSAGE_EXCEPTION_H
#define __MESSAGE_EXCEPTION_H #define __MESSAGE_EXCEPTION_H
#include <exceptions/exceptions.h>
#include <log/message_types.h>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <vector> #include <vector>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <log/message_types.h>
namespace isc { namespace isc {
namespace log { namespace log {
...@@ -31,14 +33,16 @@ namespace log { ...@@ -31,14 +33,16 @@ namespace log {
/// code and its arguments to be encapsulated in an exception and thrown /// code and its arguments to be encapsulated in an exception and thrown
/// up the stack. /// up the stack.
class MessageException : public std::exception { class MessageException : public isc::Exception {
public: public:
/// \brief Constructor /// \brief Constructor
/// ///
/// \param id Message identification. /// \param id Message identification.
/// \param lineno Line number on which error occurred (if > 0). /// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, int lineno = 0) : id_(id) MessageException(const char* file, size_t line,
MessageID id, int lineno = 0)
: isc::Exception(file, line, ""), id_(id)
{ {
if (lineno > 0) { if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno)); args_.push_back(boost::lexical_cast<std::string>(lineno));
...@@ -50,8 +54,9 @@ public: ...@@ -50,8 +54,9 @@ public:
/// \param id Message identification. /// \param id Message identification.
/// \param arg1 First message argument. /// \param arg1 First message argument.
/// \param lineno Line number on which error occurred (if > 0). /// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1, int lineno = 0) MessageException(const char* file, size_t line,
: id_(id) MessageID id, const std::string& arg1, int lineno = 0)
: isc::Exception(file, line, ""), id_(id)
{ {
if (lineno > 0) { if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno)); args_.push_back(boost::lexical_cast<std::string>(lineno));
...@@ -65,8 +70,10 @@ public: ...@@ -65,8 +70,10 @@ public:
/// \param arg1 First message argument. /// \param arg1 First message argument.
/// \param arg2 Second message argument. /// \param arg2 Second message argument.
/// \param lineno Line number on which error occurred (if > 0). /// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1, MessageException(const char* file, size_t line,
const std::string& arg2, int lineno = 0) : id_(id) MessageID id, const std::string& arg1,
const std::string& arg2, int lineno = 0)
: isc::Exception(file, line, ""), id_(id)
{ {
if (lineno > 0) { if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno)); args_.push_back(boost::lexical_cast<std::string>(lineno));
......
...@@ -48,7 +48,8 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) { ...@@ -48,7 +48,8 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) {
// Open the file. // Open the file.
ifstream infile(file.c_str()); ifstream infile(file.c_str());
if (infile.fail()) { if (infile.fail()) {
throw MessageException(LOG_INPUT_OPEN_FAIL, file, strerror(errno)); isc_throw_2(MessageException, LOG_INPUT_OPEN_FAIL, file,
strerror(errno));
} }
// Loop round reading it. As we process the file one line at a time, // Loop round reading it. As we process the file one line at a time,
...@@ -65,7 +66,7 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) { ...@@ -65,7 +66,7 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) {
// Why did the loop terminate? // Why did the loop terminate?
if (!infile.eof()) { if (!infile.eof()) {
throw MessageException(LOG_READ_ERROR, file, strerror(errno)); isc_throw_2(MessageException, LOG_READ_ERROR, file, strerror(errno));
} }
infile.close(); infile.close();
} }
...@@ -114,7 +115,8 @@ MessageReader::parseDirective(const std::string& text) { ...@@ -114,7 +115,8 @@ MessageReader::parseDirective(const std::string& text) {
} else { } else {
// Unrecognised directive // Unrecognised directive
throw MessageException(LOG_UNRECOGNISED_DIRECTIVE, tokens[0], lineno_); isc_throw_2(MessageException, LOG_UNRECOGNISED_DIRECTIVE, tokens[0],
lineno_);
} }
} }
...@@ -138,13 +140,14 @@ MessageReader::parsePrefix(const vector<string>& tokens) { ...@@ -138,13 +140,14 @@ MessageReader::parsePrefix(const vector<string>& tokens) {
// and numeric characters (and underscores) and does not start with a // and numeric characters (and underscores) and does not start with a
// digit. // digit.
if (invalidSymbol(prefix_)) { if (invalidSymbol(prefix_)) {
throw MessageException(LOG_PREFIX_INVALID_ARG, prefix_, lineno_); isc_throw_2(MessageException, LOG_PREFIX_INVALID_ARG, prefix_,
lineno_);
} }
} else { } else {
// Too many arguments // Too many arguments
throw MessageException(LOG_PREFIX_EXTRA_ARGS, lineno_); isc_throw_1(MessageException, LOG_PREFIX_EXTRA_ARGS, lineno_);
} }
} }
...@@ -172,10 +175,10 @@ MessageReader::parseNamespace(const vector<string>& tokens) { ...@@ -172,10 +175,10 @@ MessageReader::parseNamespace(const vector<string>& tokens) {
// Check argument count // Check argument count
if (tokens.size() < 2) { if (tokens.size() < 2) {
throw MessageException(LOG_NAMESPACE_NO_ARGS, lineno_); isc_throw_1(MessageException, LOG_NAMESPACE_NO_ARGS, lineno_);
} else if (tokens.size() > 2) { } else if (tokens.size() > 2) {
throw MessageException(LOG_NAMESPACE_EXTRA_ARGS, lineno_); isc_throw_1(MessageException, LOG_NAMESPACE_EXTRA_ARGS, lineno_);
} }
...@@ -187,12 +190,13 @@ MessageReader::parseNamespace(const vector<string>& tokens) { ...@@ -187,12 +190,13 @@ MessageReader::parseNamespace(const vector<string>& tokens) {
"abcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyz"
"0123456789_:"; "0123456789_:";
if (tokens[1].find_first_not_of(valid_chars) != string::npos) { if (tokens[1].find_first_not_of(valid_chars) != string::npos) {
throw MessageException(LOG_NAMESPACE_INVALID_ARG, tokens[1], lineno_); isc_throw_2(MessageException, LOG_NAMESPACE_INVALID_ARG, tokens[1],
lineno_);
} }
// All OK - unless the namespace has already been set. // All OK - unless the namespace has already been set.
if (ns_.size() != 0) { if (ns_.size() != 0) {
throw MessageException(LOG_DUPLICATE_NAMESPACE, lineno_); isc_throw_1(MessageException, LOG_DUPLICATE_NAMESPACE, lineno_);
} }
// Prefix has not been set, so set it and return success. // Prefix has not been set, so set it and return success.
...@@ -219,7 +223,7 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) { ...@@ -219,7 +223,7 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
// A line comprising just the message introducer is not valid. // A line comprising just the message introducer is not valid.
if (text.size() == 1) { if (text.size() == 1) {
throw MessageException(LOG_NO_MESSAGE_ID, text, lineno_); isc_throw_2(MessageException, LOG_NO_MESSAGE_ID, text, lineno_);
} }
// Strip off the introducer and any leading space after that. // Strip off the introducer and any leading space after that.
...@@ -230,7 +234,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) { ...@@ -230,7 +234,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
if (first_delim == string::npos) { if (first_delim == string::npos) {
// Just a single token in the line - this is not valid // Just a single token in the line - this is not valid
throw MessageException(LOG_NO_MESSAGE_TEXT, message_line, lineno_); isc_throw_2(MessageException, LOG_NO_MESSAGE_TEXT, message_line,
lineno_);
} }
// Extract the first token into the message ID, preceding it with the // Extract the first token into the message ID, preceding it with the
...@@ -240,7 +245,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) { ...@@ -240,7 +245,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
string ident = prefix_ + message_line.substr(0, first_delim); string ident = prefix_ + message_line.substr(0, first_delim);
if (prefix_.empty()) { if (prefix_.empty()) {
if (invalidSymbol(ident)) { if (invalidSymbol(ident)) {
throw MessageException(LOG_INVALID_MESSAGE_ID, ident, lineno_); isc_throw_2(MessageException, LOG_INVALID_MESSAGE_ID, ident,
lineno_);
} }
} }
isc::util::str::uppercase(ident); isc::util::str::uppercase(ident);
...@@ -252,7 +258,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) { ...@@ -252,7 +258,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
// ?? This happens if there are trailing delimiters, which should not // ?? This happens if there are trailing delimiters, which should not
// occur as we have stripped trailing spaces off the line. Just treat // occur as we have stripped trailing spaces off the line. Just treat
// this as a single-token error for simplicity's sake. // this as a single-token error for simplicity's sake.
throw MessageException(LOG_NO_MESSAGE_TEXT, message_line, lineno_); isc_throw_2(MessageException, LOG_NO_MESSAGE_TEXT, message_line,
lineno_);
} }
// Add the result to the dictionary and to the non-added list if the add to // Add the result to the dictionary and to the non-added list if the add to
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment