- ////////////////////////////////////////////////////////////////////////////////
- //
- // Throwable
- //
-
- #include <cstring>
- #include <cerrno>
-
- #include <kcpp_throwable.hpp>
-
- #ifndef MAXMSG
- #define MAXMSG (256)
- #endif
-
- namespace kcpp
- {
-
- /**
- * 最後に発生したエラーメッセージを持つ Throwable を構築します。
- * エラーメッセージを取得できない場合、空文字がメッセージに設定されます。
- */
- Throwable::Throwable() noexcept : message("")
- {
- #if (KCPP_IS_WINDOWS)
- // Window の場合
- int errnum = GetLastError();
- LPVOID lpMsgBuf;
- int ret = FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER // 動作フラグ
- | FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_TNSERTS,
- 0, // メッセージ定義位置
- errnum, // エラーコード
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 言語ID
- (LPSTR) &lpMsgBuf, // バッファアドレス
- 0, // バッファサイズ
- 0); // 挿入句
- if (ret != 0)
- {
- message = static_cast<const char*>(lpMsgBuf);
- }
- localFree(lpMsgBuf);
- #elif ((_POSIX_C_SOURCE >= 200112L || __XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
- // XSI準拠 strerror_r が提供されている
- char buf[MAXMSG];
- int ret = stderror_r(errno, buf, sizeof(buf));
- if (ret == 0)
- {
- message = buf;
- }
- #else
- // ANSI 準拠 streror を利用
- char* errMsg = strerror(errno);
- message = errMsg;
- #endif
- }
-
-
- /**
- * コピーコンストラクタ。
- *
- * @param t コピー元
- */
- Throwable::Throwable(const Throwable& t) noexcept : message(t.message)
- {
- // NOP
- }
-
-
- /**
- * 指定されたメッセージを持つ Throwable を構築します。
- *
- * @param msg メッセージ
- */
- Throwable::Throwable(const std::string& msg) noexcept : message(msg)
- {
- // NOP
- }
-
-
- /**
- * デストラクタ。
- */
- Throwable::~Throwable() noexcept
- {
- // NOP
- }
-
-
- /**
- * エラーメッセージを返します。
- *
- * @return エラーメッセージ
- */
- const char* Throwable::what() const noexcept
- {
- return message.c_str();
- }
-
- }
-