aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/Exception.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
committercrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
commitdfe62dcf8bcefc523b466e127c3edc4dc2756629 (patch)
tree1c751a14ba0da07ca2ff805633f97568060aa4c9 /include/cru/base/Exception.h
parentf51eb955e188858272230a990565931e7403f23b (diff)
downloadcru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.gz
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.bz2
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.zip
Rename common to base.
Diffstat (limited to 'include/cru/base/Exception.h')
-rw-r--r--include/cru/base/Exception.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/include/cru/base/Exception.h b/include/cru/base/Exception.h
new file mode 100644
index 00000000..609fd2c9
--- /dev/null
+++ b/include/cru/base/Exception.h
@@ -0,0 +1,60 @@
+#pragma once
+#include "String.h"
+
+#include <exception>
+#include <optional>
+
+namespace cru {
+#ifdef _MSC_VER
+#pragma warning(disable : 4275)
+#endif
+class CRU_BASE_API Exception : public std::exception {
+ public:
+ explicit Exception(String message = {},
+ std::unique_ptr<std::exception> inner = nullptr);
+
+ ~Exception() override;
+
+ public:
+ String GetMessage() const { return message_; }
+
+ std::exception* GetInner() const noexcept { return inner_.get(); }
+
+ const char* what() const noexcept override;
+
+ protected:
+ void SetMessage(String message) { message_ = std::move(message); }
+
+ void AppendMessage(StringView additional_message);
+ void AppendMessage(std::optional<StringView> additional_message);
+
+ private:
+ String message_;
+ mutable std::string utf8_message_;
+ std::unique_ptr<std::exception> inner_;
+};
+
+class CRU_BASE_API TextEncodeException : public Exception {
+ public:
+ using Exception::Exception;
+};
+
+class ErrnoException : public Exception {
+ public:
+ /**
+ * @brief will retrieve errno automatically.
+ */
+ explicit ErrnoException(String message = {});
+ ErrnoException(String message, int errno_code);
+
+ CRU_DELETE_COPY(ErrnoException)
+ CRU_DELETE_MOVE(ErrnoException)
+
+ ~ErrnoException() override = default;
+
+ int GetErrnoCode() const { return errno_code_; }
+
+ private:
+ int errno_code_;
+};
+} // namespace cru