summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Log.cxx36
-rw-r--r--src/Log.hxx10
2 files changed, 46 insertions, 0 deletions
diff --git a/src/Log.cxx b/src/Log.cxx
index 585e51f7c..65d3be824 100644
--- a/src/Log.cxx
+++ b/src/Log.cxx
@@ -20,12 +20,18 @@
#include "config.h"
#include "LogV.hxx"
#include "util/Error.hxx"
+#include "util/Domain.hxx"
+
+#include <exception>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
+/** Domain for std::exception */
+static constexpr Domain exception_domain("exception");
+
void
LogFormatV(const Domain &domain, LogLevel level, const char *fmt, va_list ap)
{
@@ -89,6 +95,36 @@ FormatError(const Domain &domain, const char *fmt, ...)
}
void
+LogError(const std::exception &e)
+{
+ Log(exception_domain, LogLevel::ERROR, e.what());
+
+ try {
+ std::rethrow_if_nested(e);
+ } catch (const std::exception &nested) {
+ LogError(nested, "nested");
+ } catch (...) {
+ Log(exception_domain, LogLevel::ERROR,
+ "Unrecognized nested exception");
+ }
+}
+
+void
+LogError(const std::exception &e, const char *msg)
+{
+ FormatError(exception_domain, "%s: %s", msg, e.what());
+
+ try {
+ std::rethrow_if_nested(e);
+ } catch (const std::exception &nested) {
+ LogError(nested);
+ } catch (...) {
+ Log(exception_domain, LogLevel::ERROR,
+ "Unrecognized nested exception");
+ }
+}
+
+void
LogError(const Error &error)
{
Log(error.GetDomain(), LogLevel::ERROR, error.GetMessage());
diff --git a/src/Log.hxx b/src/Log.hxx
index 684d5c394..f6474ff1a 100644
--- a/src/Log.hxx
+++ b/src/Log.hxx
@@ -23,6 +23,10 @@
#include "LogLevel.hxx"
#include "Compiler.h"
+namespace std {
+ class exception;
+}
+
class Error;
class Domain;
@@ -79,6 +83,12 @@ LogError(const Domain &domain, const char *msg)
Log(domain, LogLevel::ERROR, msg);
}
+void
+LogError(const std::exception &e);
+
+void
+LogError(const std::exception &e, const char *msg);
+
gcc_printf(2,3)
void
FormatError(const Domain &domain, const char *fmt, ...);