diff options
Diffstat (limited to 'src/Log.cxx')
-rw-r--r-- | src/Log.cxx | 36 |
1 files changed, 36 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()); |