diff options
| author | Wladimir J. van der Laan <[email protected]> | 2017-03-13 14:43:07 +0100 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2017-03-13 14:43:19 +0100 |
| commit | 8040ae6fc576e9504186f2ae3ff2c8125de1095c (patch) | |
| tree | f6fa0b44496c704265d9cc89f62b6003eb8a05e6 | |
| parent | Merge #9940: Fix verify-commits on OSX, update for new bad Tree-SHA512, point... (diff) | |
| parent | util: Throw tinyformat::format_error on formatting error (diff) | |
| download | discoin-8040ae6fc576e9504186f2ae3ff2c8125de1095c.tar.xz discoin-8040ae6fc576e9504186f2ae3ff2c8125de1095c.zip | |
Merge #9963: util: Properly handle errors during log message formatting
b651270 util: Throw tinyformat::format_error on formatting error (Wladimir J. van der Laan)
3b092bd util: Properly handle errors during log message formatting (Wladimir J. van der Laan)
Tree-SHA512: 85e3b7afec2255fc88034187f1abd6060e9421de17ed4e3d918416f393429a99cc2c974b362099aaaff6970549df47664bea4c857c4e46acc0789663201dc541
| -rw-r--r-- | src/tinyformat.h | 9 | ||||
| -rw-r--r-- | src/util.h | 20 |
2 files changed, 23 insertions, 6 deletions
diff --git a/src/tinyformat.h b/src/tinyformat.h index 17f0360c4..5022d4680 100644 --- a/src/tinyformat.h +++ b/src/tinyformat.h @@ -123,7 +123,7 @@ namespace tinyformat {} namespace tfm = tinyformat; // Error handling; calls assert() by default. -#define TINYFORMAT_ERROR(reasonString) throw std::runtime_error(reasonString) +#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString) // Define for C++11 variadic templates which make the code shorter & more // general. If you don't define this, C++11 support is autodetected below. @@ -164,6 +164,13 @@ namespace tfm = tinyformat; namespace tinyformat { +class format_error: public std::runtime_error +{ +public: + format_error(const std::string &what): std::runtime_error(what) { + } +}; + //------------------------------------------------------------------------------ namespace detail { diff --git a/src/util.h b/src/util.h index e27ce121c..87eb16c91 100644 --- a/src/util.h +++ b/src/util.h @@ -73,14 +73,24 @@ bool LogAcceptCategory(const char* category); /** Send a string to the log output */ int LogPrintStr(const std::string &str); -#define LogPrint(category, ...) do { \ - if (LogAcceptCategory((category))) { \ - LogPrintStr(tfm::format(__VA_ARGS__)); \ +/** Get format string from VA_ARGS for error reporting */ +template<typename... Args> std::string FormatStringFromLogArgs(const char *fmt, const Args&... args) { return fmt; } + +#define LogPrintf(...) do { \ + std::string _log_msg_; /* Unlikely name to avoid shadowing variables */ \ + try { \ + _log_msg_ = tfm::format(__VA_ARGS__); \ + } catch (tinyformat::format_error &e) { \ + /* Original format string will have newline so don't add one here */ \ + _log_msg_ = "Error \"" + std::string(e.what()) + "\" while formatting log message: " + FormatStringFromLogArgs(__VA_ARGS__); \ } \ + LogPrintStr(_log_msg_); \ } while(0) -#define LogPrintf(...) do { \ - LogPrintStr(tfm::format(__VA_ARGS__)); \ +#define LogPrint(category, ...) do { \ + if (LogAcceptCategory((category))) { \ + LogPrintf(__VA_ARGS__); \ + } \ } while(0) template<typename... Args> |