c++ - How to supplement boost::exception with a proper what() function -
i boost::exception quite bit, i'm quite bothered not provide proper what() function out of box. don't confused, have nice boost::diagnostic_information contains information see in hypothetic what()
function since boost::exception
not inherit std::exception
what()
function if multiple inherit (as suggested tutorial, see line below) default useless what()
std::exception
base explains nothing exception.
struct my_exception: virtual std::exception, virtual boost::exception { };
now tried override what()
, make return boost::diagnostic_information
somehow not work, i'm bit puzzled. might because loop i'm not quite sure.
ps: reason want implement what()
right is shown default lot of tools if program dies them (e.g. gnu compiler show nice fatal error, , display what(), boost unit tests tools etc.).
#include <boost/exception/all.hpp> struct my_exception: virtual std::exception, virtual boost::exception {}; struct my_exception2: virtual std::exception, virtual boost::exception { virtual const char* what() const throw() { return "what"; } }; struct my_exception3: virtual std::exception, virtual boost::exception { virtual const char* what() const throw() { return boost::diagnostic_information(this).c_str(); } }; int main() { try { boost_throw_exception(my_exception()); } catch (const std::exception& e){ std::cout << e.what() << std::endl; //this useless ___ std::exception } try { boost_throw_exception(my_exception()); } catch (const boost::exception& e){ std::cout << boost::diagnostic_information(e) << std::endl; //this i'd see ___ main.cpp(39): throw in function int main() ___ dynamic exception type: boost::exception_detail::clone_impl ___ std::exception::what: std::exception } try { boost_throw_exception(my_exception2()); } catch (const std::exception& e){ std::cout << e.what() << std::endl; //overriding works ___ } try { boost_throw_exception(my_exception3()); } catch (const std::exception& e){ std::cout << e.what() << std::endl; //but somehow here not work ___ unknown exception. } }
first, boost::diagnostic_information
takes exception (const) reference, , this
pointer:
return boost::diagnostic_information(*this).c_str(); ^-- here
second, once you've fixed that, you've correctly anticipated results in infinite recursion boost::diagnostic_information
calls std::exception::what()
. possible work around guard member or similar:
struct my_exception3: std::exception, boost::exception { mutable bool in_what = false; virtual const char* what() const throw() { struct g { bool &b; ~g() { b = false; } } guard{in_what}; return in_what ? "what" : (in_what = true, boost::diagnostic_information(*this).c_str()); } };
finally, you're using c_str
destructed temporary string
. i'll leave solution problem exercise.
Comments
Post a Comment