diff options
Diffstat (limited to 'src/base/Exception.cpp')
-rw-r--r-- | src/base/Exception.cpp | 36 |
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 |