// 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