Skip to content

Commit

Permalink
Merge bitcoin#9963: util: Properly handle errors during log message f…
Browse files Browse the repository at this point in the history
…ormatting

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
  • Loading branch information
laanwj committed Mar 13, 2017
2 parents fa99663 + b651270 commit 8040ae6
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
9 changes: 8 additions & 1 deletion src/tinyformat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 {

Expand Down
20 changes: 15 additions & 5 deletions src/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down

0 comments on commit 8040ae6

Please sign in to comment.