Re: Exception class with shift operator
On Jan 8, 3:22 pm, Ulrich Eckhardt <dooms...@knuut.de> wrote:
virtual const char* what() const throw()
{ return my_ss.str().c_str(); }
Have you tried this? IIRC, stringstream::str() returns by value, which
would
obviously be fatal!
You are definitely right, this is really dangerous.
It worked in my simple tests because I used to store the returned
const char *
content in a std::string:
std::string s = e.what();
std::cout << s; // this should work
...
However now it is clear to me that the following code won't work:
const char *s = e.what();
// s is now invalid!
std::cout << s; // this would crash
template <typename T> runtime_error& operator<<(const T& v)
{ my_ss << v; return *this; }
This one needs two (IIRC) more overloads to work with overloaded functions
like 'std::endl' or 'std::hex'. I think you need inserters for
std::ios_base& (*fp)(std::ios_base&)
std::ostream& (*fp)(std::ostream&)
Yes again, using at least std::hex would be useful.
[...] Further, you are throwing the stringstream along with the exception,
though it isn't needed at that time any more. Lastly, if my guess about
stringstream::str() is true, you will have to store the string in
parallel,
which sounds like even more waste to me.
A possible answer to both items that seems really interesting to me
has been
suggested by Alberto Ganesh Barbati in a later post, consisting in
using a shared_ptr
to stringstream as a member instead of the stringstream itself, and a
(mutable) string.
This seems to me a very clever compromise.
BTW: there was/is a proposal to add an exception library to Boost that
allows attaching various properties to an exception. Further, there is
Boost.Format which allows formatting messages in place, somewhere like
this:
throw std::runtime_error( str(
boost::format("%1: x is %2 and u is %3" %__FUNCTION__ %x %u)
));
I'd take a look at both, if not as alternative then at least for
inspiration. ;)
I will certainly consider these two libraries more deeply, as you
suggest.
As a first impression, Boost.Exception seems to require a little more
writing
compared to what I would like to do, while Boost.Format seems very
concise.
Thanks a lot for your suggestions,
eca
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]