refactor: Extract util/exception from util/system

This is a minimal extraction of a single function, but also the only use
of std::exception in util/system.

The background of this commit is an ongoing effort to decouple the
libbitcoinkernel library from the ArgsManager defined in system.h.
Moving the function out of system.h allows including it from a separate
source file without including the ArgsManager definitions from system.h.
This commit is contained in:
Ben Woosley
2023-03-06 17:22:33 +01:00
committed by TheCharlatan
parent f7bdcfc83f
commit e7333b420e
15 changed files with 69 additions and 30 deletions

41
src/util/exception.cpp Normal file
View File

@@ -0,0 +1,41 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2023 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <util/exception.h>
#include <logging.h>
#include <tinyformat.h>
#include <exception>
#include <iostream>
#include <string>
#include <typeinfo>
#ifdef WIN32
#include <windows.h>
#endif // WIN32
static std::string FormatException(const std::exception* pex, std::string_view thread_name)
{
#ifdef WIN32
char pszModule[MAX_PATH] = "";
GetModuleFileNameA(nullptr, pszModule, sizeof(pszModule));
#else
const char* pszModule = "bitcoin";
#endif
if (pex)
return strprintf(
"EXCEPTION: %s \n%s \n%s in %s \n", typeid(*pex).name(), pex->what(), pszModule, thread_name);
else
return strprintf(
"UNKNOWN EXCEPTION \n%s in %s \n", pszModule, thread_name);
}
void PrintExceptionContinue(const std::exception* pex, std::string_view thread_name)
{
std::string message = FormatException(pex, thread_name);
LogPrintf("\n\n************************\n%s\n", message);
tfm::format(std::cerr, "\n\n************************\n%s\n", message);
}

14
src/util/exception.h Normal file
View File

@@ -0,0 +1,14 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2023 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_UTIL_EXCEPTION_H
#define BITCOIN_UTIL_EXCEPTION_H
#include <exception>
#include <string_view>
void PrintExceptionContinue(const std::exception* pex, std::string_view thread_name);
#endif // BITCOIN_UTIL_EXCEPTION_H

View File

@@ -792,29 +792,6 @@ std::string HelpMessageOpt(const std::string &option, const std::string &message
std::string("\n\n");
}
static std::string FormatException(const std::exception* pex, std::string_view thread_name)
{
#ifdef WIN32
char pszModule[MAX_PATH] = "";
GetModuleFileNameA(nullptr, pszModule, sizeof(pszModule));
#else
const char* pszModule = "bitcoin";
#endif
if (pex)
return strprintf(
"EXCEPTION: %s \n%s \n%s in %s \n", typeid(*pex).name(), pex->what(), pszModule, thread_name);
else
return strprintf(
"UNKNOWN EXCEPTION \n%s in %s \n", pszModule, thread_name);
}
void PrintExceptionContinue(const std::exception* pex, std::string_view thread_name)
{
std::string message = FormatException(pex, thread_name);
LogPrintf("\n\n************************\n%s\n", message);
tfm::format(std::cerr, "\n\n************************\n%s\n", message);
}
fs::path GetDefaultDataDir()
{
// Windows: C:\Users\Username\AppData\Roaming\Bitcoin

View File

@@ -19,12 +19,10 @@
#include <fs.h>
#include <logging.h>
#include <sync.h>
#include <tinyformat.h>
#include <util/settings.h>
#include <util/time.h>
#include <any>
#include <exception>
#include <map>
#include <optional>
#include <set>
@@ -52,8 +50,6 @@ bool error(const char* fmt, const Args&... args)
return false;
}
void PrintExceptionContinue(const std::exception* pex, std::string_view thread_name);
/**
* Ensure file contents are fully committed to disk, using a platform-specific
* feature analogous to fsync().

View File

@@ -5,7 +5,7 @@
#include <util/thread.h>
#include <logging.h>
#include <util/system.h>
#include <util/exception.h>
#include <util/threadnames.h>
#include <exception>