From: Tomek Mrugalski Date: Mon, 17 Aug 2015 19:33:53 +0000 (+0200) Subject: [support8785] Verbose Exception::what() has been implemented. X-Git-Tag: trac4003_base~1^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2954301e6d5bfb54b4e003ac0b774358914b0234;p=thirdparty%2Fkea.git [support8785] Verbose Exception::what() has been implemented. This change by itself does nothing, but it allows changing e.what() to e.what(true) to get more details about an exception. This can be useful for exception debugging. --- diff --git a/src/lib/exceptions/exceptions.cc b/src/lib/exceptions/exceptions.cc index 2a374da418..d1ed651010 100644 --- a/src/lib/exceptions/exceptions.cc +++ b/src/lib/exceptions/exceptions.cc @@ -22,18 +22,30 @@ namespace isc { const char* Exception::what() const throw() { + return (what(false)); +} + +const char* +Exception::what(bool verbose) const throw() { + const char* whatstr = "isc::Exception"; - // XXX: even though it's very unlikely that c_str() throws an exception, + // XXX: Even though it's very unlikely that c_str() throws an exception, // it's still not 100% guaranteed. To meet the exception specification // of this function, we catch any unexpected exception and fall back to // the pre-defined constant. try { - whatstr = what_.c_str(); + if (verbose) { + static std::stringstream location; + location.str(""); + location << what_ << "[" << file_ << ":" << line_ << "]"; + whatstr = location.str().c_str(); + } else { + whatstr = what_.c_str(); + } } catch (...) { // no exception handling is necessary. just have to catch exceptions. } - return (whatstr); } diff --git a/src/lib/exceptions/exceptions.h b/src/lib/exceptions/exceptions.h index d7e270dbab..e9dc3d6d1d 100644 --- a/src/lib/exceptions/exceptions.h +++ b/src/lib/exceptions/exceptions.h @@ -73,6 +73,16 @@ public: /// /// @return A C-style character string of the exception cause. virtual const char* what() const throw(); + + /// \brief Returns a C-style charater string of the cause of exception. + /// + /// With verbose set to true, also returns file name and line numbers. + /// Note that we can't simply define a single what() method with parameters, + /// as the compiler would complain that it shadows the base class method. + /// + /// \param verbose if set to true, filename and line number will be added. + /// \return A C-style character string of the exception cause. + virtual const char* what(bool verbose) const throw(); //@} ///