Add backtrace to exception message 50/24450/7
authorAdam Malinowski <a.malinowsk2@partner.samsung.com>
Mon, 14 Jul 2014 12:39:55 +0000 (14:39 +0200)
committerAdam Malinowski <a.malinowsk2@partner.samsung.com>
Wed, 16 Jul 2014 07:21:25 +0000 (09:21 +0200)
This patch introduces new method 'message()' in class Exception
which must be overloaded by all dervied classes instead of
'what()' method. This is needed to add backtrace info to
exception message.

Change-Id: Ic451578c72566300283843468a32297fdec42f56

15 files changed:
src/common/exceptions/BucketAlreadyExistsException.h
src/common/exceptions/BucketNotExistsException.h
src/common/exceptions/BucketRecordCorruptedException.h
src/common/exceptions/DefaultBucketDeletionException.h
src/common/exceptions/DescriptorNotExistsException.h
src/common/exceptions/Exception.h
src/common/exceptions/InitException.h
src/common/exceptions/InvalidProtocolException.h
src/common/exceptions/NotImplementedException.h
src/common/exceptions/NullPointerException.h
src/common/exceptions/OutOfDataException.h
src/common/exceptions/PluginNotFoundException.h
src/common/exceptions/ServerConnectionErrorException.h
src/common/exceptions/UnexpectedErrorException.h
test/common/exceptions/bucketrecordcorrupted.cpp

index 5fbdbe9..9fa7d6f 100644 (file)
@@ -36,6 +36,10 @@ public:
     BucketAlreadyExistsException(const PolicyBucketId &bucketId) : m_bucketId(bucketId) {}
     virtual ~BucketAlreadyExistsException() = default;
 
+    virtual const std::string message(void) const {
+        return "BucketAlreadyExistsException";
+    }
+
 private:
     PolicyBucketId m_bucketId;
 
index c1668a6..54c942e 100644 (file)
@@ -36,6 +36,10 @@ public:
     BucketNotExistsException(const PolicyBucketId &bucketId) : m_bucketId(bucketId) {}
     virtual ~BucketNotExistsException() = default;
 
+    virtual const std::string message(void) const {
+        return "BucketNotExistsException";
+    }
+
 private:
     PolicyBucketId m_bucketId;
 
index aaa5e11..227c1d9 100644 (file)
@@ -50,14 +50,14 @@ public:
         return copy;
     }
 
-    virtual const char* what(void) const noexcept {
+    virtual const std::string message(void) const {
         if (m_whatMsg.empty()) {
             m_whatMsg = "Bucket record corrupted at"
                 + formatedFilename()
                 + formatedLineNumber()
                 + ": <" + slicedLine() + ">";
         }
-        return m_whatMsg.c_str();
+        return m_whatMsg;
     }
 
 protected:
index 18101e7..6a92ec5 100644 (file)
@@ -33,6 +33,10 @@ class DefaultBucketDeletionException : public Exception {
 public:
     DefaultBucketDeletionException() = default;
     virtual ~DefaultBucketDeletionException() = default;
+
+    virtual const std::string message(void) const {
+        return "DefaultBucketDeletionException";
+    }
 };
 
 } /* namespace Cynara */
index ab12771..5dd9553 100644 (file)
@@ -45,8 +45,8 @@ public:
 
     virtual ~DescriptorNotExistsException() = default;
 
-    virtual const char *what(void) const noexcept {
-        return m_whatMsg.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMsg;
     }
 };
 
index b4d11b5..92546b2 100644 (file)
 #define SRC_COMMON_EXCEPTIONS_EXCEPTION_H_
 
 #include <exception>
+#include <log/Backtrace.h>
 
 namespace Cynara {
 
 class Exception : public std::exception {
 public:
-    Exception() = default;
+    Exception() {
+        m_backtrace = Backtrace::getBacktrace();
+    }
+
     virtual ~Exception() = default;
+
+    virtual const char *what(void) const noexcept {
+        return (message() + " From: " + m_backtrace).c_str();
+    }
+
+    virtual const std::string message(void) const = 0;
+
+private:
+    std::string m_backtrace;
 };
 
 } /* namespace Cynara */
index f3f69fa..d06e1d7 100644 (file)
@@ -33,6 +33,10 @@ class InitException : public Exception {
 public:
     InitException() = default;
     virtual ~InitException() = default;
+
+    virtual const std::string message(void) const {
+        return "InitException";
+    }
 };
 
 } /* namespace Cynara */
index 8b1317b..a2d65d1 100644 (file)
@@ -61,8 +61,8 @@ public:
 
     virtual ~InvalidProtocolException() = default;
 
-    virtual const char *what(void) const noexcept {
-        return m_whatMessage.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMessage;
     }
 
     ExceptionType exceptionTyp(void) const {
index 90fa586..ceabb9a 100644 (file)
@@ -33,6 +33,10 @@ class NotImplementedException : public Exception {
 public:
     NotImplementedException() = default;
     virtual ~NotImplementedException() = default;
+
+    virtual const std::string message(void) const {
+        return "NotImplementedException";
+    }
 };
 
 } /* namespace Cynara */
index 0b5d30e..ffd0bef 100644 (file)
@@ -44,8 +44,8 @@ public:
 
     virtual ~NullPointerException() = default;
 
-    virtual const char* what() const noexcept {
-        return m_whatMsg.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMsg;
     }
 };
 
index e7513b1..827eb7a 100644 (file)
@@ -46,8 +46,8 @@ public:
 
     virtual ~OutOfDataException() = default;
 
-    virtual const char* what() const noexcept {
-        return m_whatMsg.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMsg;
     }
 };
 
index 5cbb155..345fd1d 100644 (file)
@@ -47,8 +47,8 @@ public:
 
     virtual ~PluginNotFoundException() = default;
 
-    virtual const char *what(void) const noexcept {
-        return m_whatMessage.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMessage;
     }
 };
 
index ebdf574..a5a7b08 100644 (file)
@@ -33,7 +33,7 @@ class ServerConnectionErrorException : public Exception {
 public:
     ServerConnectionErrorException() = default;
     virtual ~ServerConnectionErrorException() = default;
-    virtual const char* what() const noexcept {
+    virtual const std::string message(void) const {
         return "ServerConnectionError";
     }
 };
index 0b85ad4..a7d100b 100644 (file)
@@ -51,8 +51,8 @@ public:
 
     virtual ~UnexpectedErrorException() = default;
 
-    virtual const char* what() const noexcept {
-        return m_whatMessage.c_str();
+    virtual const std::string message(void) const {
+        return m_whatMessage;
     }
 };
 
index ddc6039..f940442 100644 (file)
 using namespace Cynara;
 
 TEST(BucketRecordCorruptedException, line) {
+    using ::testing::StartsWith;
+
     BucketRecordCorruptedException ex("line");
     auto expected = "Bucket record corrupted at line: <line>";
-    ASSERT_STREQ(expected, ex.what());
+
+    ASSERT_THAT(ex.what(), StartsWith(expected));
     ASSERT_EQ("line", ex.line());
     ASSERT_EQ("", ex.filename());
     ASSERT_EQ(0, ex.lineNumber());
 }
 
 TEST(BucketRecordCorruptedException, line_lineno) {
+    using ::testing::StartsWith;
+
     auto ex = BucketRecordCorruptedException("line").withLineNumber(10);
     auto expected = "Bucket record corrupted at line 10: <line>";
-    ASSERT_STREQ(expected, ex.what());
+
+    ASSERT_THAT(ex.what(), StartsWith(expected));
     ASSERT_EQ("line", ex.line());
     ASSERT_EQ("", ex.filename());
     ASSERT_EQ(10, ex.lineNumber());
 }
 
 TEST(BucketRecordCorruptedException, line_lineno_filename) {
+    using ::testing::StartsWith;
+
     auto ex = BucketRecordCorruptedException("line").withLineNumber(10).withFilename("bucket.bkt");
     auto expected = "Bucket record corrupted at bucket.bkt:10: <line>";
-    ASSERT_STREQ(expected, ex.what());
+
+    ASSERT_THAT(ex.what(), StartsWith(expected));
     ASSERT_EQ("line", ex.line());
     ASSERT_EQ("bucket.bkt", ex.filename());
     ASSERT_EQ(10, ex.lineNumber());
 }
 
 TEST(BucketRecordCorruptedException, line_filename) {
+    using ::testing::StartsWith;
+
     auto ex = BucketRecordCorruptedException("line").withFilename("bucket.bkt");
     auto expected = "Bucket record corrupted at bucket.bkt: <line>";
-    ASSERT_STREQ(expected, ex.what());
+
+    ASSERT_THAT(ex.what(), StartsWith(expected));
     ASSERT_EQ("line", ex.line());
     ASSERT_EQ("bucket.bkt", ex.filename());
     ASSERT_EQ(0, ex.lineNumber());
 }
 
 TEST(BucketRecordCorruptedException, line_sliced) {
+    using ::testing::StartsWith;
+
     std::string line = "A very long line placed here just to check,"
                        " if slicing works as expected (83 chars)";
     auto ex = BucketRecordCorruptedException(line);
     auto expected = "Bucket record corrupted at line:"
             " <A very long line placed here just to check, if sli...>";
-    ASSERT_STREQ(expected, ex.what());
+
+    ASSERT_THAT(ex.what(), StartsWith(expected));
     ASSERT_EQ(line, ex.line());
     ASSERT_EQ("", ex.filename());
     ASSERT_EQ(0, ex.lineNumber());