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:
throw type(__FILE__, __LINE__, oss__.str().c_str(), param1); \
} 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
......
......@@ -16,3 +16,4 @@ noinst_PROGRAMS = message
message_SOURCES = message.cc
message_LDADD = $(top_builddir)/src/lib/log/liblog.la
message_LDADD += $(top_builddir)/src/lib/util/libutil.la
message_LDADD += $(top_builddir)/src/lib/exceptions/libexceptions.la
......@@ -25,6 +25,8 @@
#include <time.h>
#include <unistd.h>
#include <exceptions/exceptions.h>
#include <util/filename.h>
#include <util/strutil.h>
......@@ -325,8 +327,8 @@ writeHeaderFile(const string& file, const vector<string>& ns_components,
ofstream hfile(header_file.fullName().c_str());
if (hfile.fail()) {
throw MessageException(LOG_OPEN_OUTPUT_FAIL, header_file.fullName(),
strerror(errno));
isc_throw_2(MessageException, LOG_OPEN_OUTPUT_FAIL,
header_file.fullName(), strerror(errno));
}
// 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,
// Report errors (if any) and exit
if (hfile.fail()) {
throw MessageException(LOG_WRITE_ERROR, header_file.fullName(),
isc_throw_2(MessageException, LOG_WRITE_ERROR, header_file.fullName(),
strerror(errno));
}
......@@ -425,8 +427,8 @@ writeProgramFile(const string& file, const vector<string>& ns_components,
ofstream ccfile(program_file.fullName().c_str());
if (ccfile.fail()) {
throw MessageException(LOG_OPEN_OUTPUT_FAIL, program_file.fullName(),
strerror(errno));
isc_throw_2(MessageException, LOG_OPEN_OUTPUT_FAIL,
program_file.fullName(), strerror(errno));
}
// 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,
// Report errors (if any) and exit
if (ccfile.fail()) {
throw MessageException(LOG_WRITE_ERROR, program_file.fullName(),
isc_throw_2(MessageException, LOG_WRITE_ERROR, program_file.fullName(),
strerror(errno));
}
......
......@@ -15,12 +15,14 @@
#ifndef __MESSAGE_EXCEPTION_H
#define __MESSAGE_EXCEPTION_H
#include <exceptions/exceptions.h>
#include <log/message_types.h>
#include <stdexcept>
#include <string>
#include <vector>
#include <boost/lexical_cast.hpp>
#include <log/message_types.h>
namespace isc {
namespace log {
......@@ -31,14 +33,16 @@ namespace log {
/// code and its arguments to be encapsulated in an exception and thrown
/// up the stack.
class MessageException : public std::exception {
class MessageException : public isc::Exception {
public:
/// \brief Constructor
///
/// \param id Message identification.
/// \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) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
......@@ -50,8 +54,9 @@ public:
/// \param id Message identification.
/// \param arg1 First message argument.
/// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1, int lineno = 0)
: id_(id)
MessageException(const char* file, size_t line,
MessageID id, const std::string& arg1, int lineno = 0)
: isc::Exception(file, line, ""), id_(id)
{
if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
......@@ -65,8 +70,10 @@ public:
/// \param arg1 First message argument.
/// \param arg2 Second message argument.
/// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1,
const std::string& arg2, int lineno = 0) : id_(id)
MessageException(const char* file, size_t line,
MessageID id, const std::string& arg1,
const std::string& arg2, int lineno = 0)
: isc::Exception(file, line, ""), id_(id)
{
if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
......
......@@ -48,7 +48,8 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) {
// Open the file.
ifstream infile(file.c_str());
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,
......@@ -65,7 +66,7 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) {
// Why did the loop terminate?
if (!infile.eof()) {
throw MessageException(LOG_READ_ERROR, file, strerror(errno));
isc_throw_2(MessageException, LOG_READ_ERROR, file, strerror(errno));
}
infile.close();
}
......@@ -114,7 +115,8 @@ MessageReader::parseDirective(const std::string& text) {
} else {
// 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) {
// and numeric characters (and underscores) and does not start with a
// digit.
if (invalidSymbol(prefix_)) {
throw MessageException(LOG_PREFIX_INVALID_ARG, prefix_, lineno_);
isc_throw_2(MessageException, LOG_PREFIX_INVALID_ARG, prefix_,
lineno_);
}
} else {
// 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) {
// Check argument count
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) {
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) {
"abcdefghijklmnopqrstuvwxyz"
"0123456789_:";
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.
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.
......@@ -219,7 +223,7 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
// A line comprising just the message introducer is not valid.
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.
......@@ -230,7 +234,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
if (first_delim == string::npos) {
// 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
......@@ -240,7 +245,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
string ident = prefix_ + message_line.substr(0, first_delim);
if (prefix_.empty()) {
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);
......@@ -252,7 +258,8 @@ MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
// ?? This happens if there are trailing delimiters, which should not
// occur as we have stripped trailing spaces off the line. Just treat
// 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
......
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