Re: Exception base class
Lars Schouw wrote:
I want to construct an exception base class that is easy to use.
Ideally I want to be able to throw exceptions in one liners like this:
throw Exception("string1" + "string2 <number>", 5.0);
This will never compile because the expression
"string1" + "string2 <number>"
doesn't.
I can use boost::format but don't want to use any boost in my code.
Would look like this.. a two liner.
string err = str( boost::format("test %s%") % "some more into");
throw Exception("string1" + "string2 <number>", 5.0);
You could also create an exception object and then add info before
eventually throwing it. All in one line:
throw your_exception("foo").add_context("bar", 5.0);
This just requires that add_context() returns a reference to *this, so that
you can chain further such calls.
Alternatively, create a set of function overloads:
void
throw_exception(char const* message);
template<typename P1>
void
throw_exception(char const* message,
char const* name1, P1 const& value1);
template<typename P1, typename P2>
void
throw_exception(char const* message,
char const* name1, P1 const& value1,
char const* name2, P2 const& value2);
...
These don't actually make the construction of the exception more terse, but
they do it somewhere else. If you want a format string, you can of course
do the same.
class Base : public std::exception
{
public:
Base(const std::string& whatStr) : m_whatStr(whatStr) {}
virtual const char* what() const throw()
{ return m_whatStr.c_str(); }
virtual ~Base() throw () {}
private:
std::string m_whatStr;
};
Note: you could as well use std::runtime_error, which also takes a
std::string in its constructor.
Uli
--
Sator Laser GmbH
Gesch??ftsf??hrer: Thorsten F??cking, Amtsgericht Hamburg HR B62 932
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]