aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/except.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencore/except.cpp')
-rw-r--r--src/zencore/except.cpp93
1 files changed, 93 insertions, 0 deletions
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 <fmt/format.h>
+#include <zencore/except.h>
+
+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