From 075d17f8ada47e990fe94606c3d21df409223465 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Tue, 2 May 2023 10:01:47 +0200 Subject: moved source directories into `/src` (#264) * moved source directories into `/src` * updated bundle.lua for new `src` path * moved some docs, icon * removed old test trees --- src/zencore/except.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/zencore/except.cpp (limited to 'src/zencore/except.cpp') diff --git a/src/zencore/except.cpp b/src/zencore/except.cpp new file mode 100644 index 000000000..2749d1984 --- /dev/null +++ b/src/zencore/except.cpp @@ -0,0 +1,93 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include +#include + +namespace zen { + +#if ZEN_PLATFORM_WINDOWS + +class WindowsException : public std::exception +{ +public: + WindowsException(std::string_view Message) + { + m_hResult = HRESULT_FROM_WIN32(GetLastError()); + m_Message = Message; + } + + WindowsException(HRESULT hRes, std::string_view Message) + { + m_hResult = hRes; + m_Message = Message; + } + + WindowsException(HRESULT hRes, const char* Message, const char* Detail) + { + m_hResult = hRes; + + ExtendableStringBuilder<128> msg; + msg.Append(Message); + msg.Append(" (detail: '"); + msg.Append(Detail); + msg.Append("')"); + + m_Message = msg.c_str(); + } + + virtual const char* what() const override { return m_Message.c_str(); } + +private: + std::string m_Message; + HRESULT m_hResult; +}; + +void +ThrowSystemException([[maybe_unused]] HRESULT hRes, [[maybe_unused]] std::string_view Message) +{ + if (HRESULT_FACILITY(hRes) == FACILITY_WIN32) + { + throw std::system_error(std::error_code(hRes & 0xffff, std::system_category()), std::string(Message)); + } + else + { + throw WindowsException(hRes, Message); + } +} + +#endif // ZEN_PLATFORM_WINDOWS + +void +ThrowSystemError(uint32_t ErrorCode, std::string_view Message) +{ + throw std::system_error(std::error_code(ErrorCode, std::system_category()), std::string(Message)); +} + +std::string +GetLastErrorAsString() +{ + return GetSystemErrorAsString(zen::GetLastError()); +} + +std::string +GetSystemErrorAsString(uint32_t ErrorCode) +{ + return std::error_code(ErrorCode, std::system_category()).message(); +} + +#if defined(__cpp_lib_source_location) +void +ThrowLastErrorImpl(std::string_view Message, const std::source_location& Location) +{ + throw std::system_error(std::error_code(zen::GetLastError(), std::system_category()), + fmt::format("{}({}): {}", Location.file_name(), Location.line(), Message)); +} +#else +void +ThrowLastError(std::string_view Message) +{ + throw std::system_error(std::error_code(zen::GetLastError(), std::system_category()), std::string(Message)); +} +#endif + +} // namespace zen -- cgit v1.2.3