mamba/libmamba/src/core/error_handling.cpp

104 lines
3.1 KiB
C++

#include "mamba/core/error_handling.hpp"
#include "mamba/core/logging.hpp"
namespace mamba
{
namespace
{
void maybe_dump_backtrace(mamba_error_code ec)
{
if (ec == mamba_error_code::internal_failure)
{
logging::log_stacktrace();
}
}
}
mamba_error::mamba_error(const std::string& msg, mamba_error_code ec)
: base_type(msg)
, m_error_code(ec)
{
maybe_dump_backtrace(m_error_code);
}
mamba_error::mamba_error(const char* msg, mamba_error_code ec)
: base_type(msg)
, m_error_code(ec)
{
maybe_dump_backtrace(m_error_code);
}
mamba_error::mamba_error(const std::string& msg, mamba_error_code ec, std::any&& data)
: base_type(msg)
, m_error_code(ec)
, m_data(std::move(data))
{
maybe_dump_backtrace(m_error_code);
}
mamba_error::mamba_error(const char* msg, mamba_error_code ec, std::any&& data)
: base_type(msg)
, m_error_code(ec)
, m_data(std::move(data))
{
maybe_dump_backtrace(m_error_code);
}
mamba_error_code mamba_error::error_code() const noexcept
{
return m_error_code;
}
const std::any& mamba_error::data() const noexcept
{
return m_data;
}
constexpr const char* mamba_aggregated_error::m_base_message; // = "Many errors occurred:\n";
mamba_aggregated_error::mamba_aggregated_error(error_list_t&& error_list)
: base_type(mamba_aggregated_error::m_base_message, mamba_error_code::aggregated)
, m_error_list(std::move(error_list))
, m_aggregated_message()
{
}
const char* mamba_aggregated_error::what() const noexcept
{
if (m_aggregated_message.empty())
{
m_aggregated_message = m_base_message;
for (const mamba_error& er : m_error_list)
{
m_aggregated_message += er.what();
m_aggregated_message += "\n";
}
m_aggregated_message += "If you run into this error repeatedly, your package cache may be corrupted.\n"
"Please try running `mamba clean -a` to remove this cache before retrying the operation.\n"
"\n"
"If you still are having issues, please report the error on `mamba-org/mamba`'s issue tracker:\n"
"https://github.com/mamba-org/mamba/issues/new?assignees=&labels=&projects=&template=bug.yml";
}
return m_aggregated_message.c_str();
}
tl::unexpected<mamba_error> make_unexpected(const char* msg, mamba_error_code ec)
{
return tl::make_unexpected(mamba_error(msg, ec));
}
tl::unexpected<mamba_error> make_unexpected(const std::string& msg, mamba_error_code ec)
{
return tl::make_unexpected(mamba_error(msg, ec));
}
tl::unexpected<mamba_aggregated_error> make_unexpected(std::vector<mamba_error>&& error_list)
{
return tl::make_unexpected(mamba_aggregated_error(std::move(error_list)));
}
}