aboutsummaryrefslogtreecommitdiff
path: root/src/base/Exception.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/Exception.cpp')
-rw-r--r--src/base/Exception.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/base/Exception.cpp b/src/base/Exception.cpp
new file mode 100644
index 00000000..19938970
--- /dev/null
+++ b/src/base/Exception.cpp
@@ -0,0 +1,36 @@
+#include "cru/base/Exception.h"
+
+#include "cru/base/Format.h"
+
+#include <cerrno>
+
+namespace cru {
+Exception::Exception(String message, std::unique_ptr<std::exception> inner)
+ : message_(std::move(message)), inner_(std::move(inner)) {}
+
+Exception::~Exception() {}
+
+const char* Exception::what() const noexcept {
+ if (!message_.empty() && utf8_message_.empty()) {
+ utf8_message_ = message_.ToUtf8();
+ }
+
+ return utf8_message_.c_str();
+}
+
+void Exception::AppendMessage(StringView additional_message) {
+ message_ += u" ";
+ message_ += additional_message;
+}
+
+void Exception::AppendMessage(std::optional<StringView> additional_message) {
+ if (additional_message) AppendMessage(*additional_message);
+}
+
+ErrnoException::ErrnoException(String message)
+ : ErrnoException(message, errno) {}
+
+ErrnoException::ErrnoException(String message, int errno_code)
+ : Exception(Format(u"{}. Errno is {}.", message, errno_code)),
+ errno_code_(errno_code) {}
+} // namespace cru