aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/Exception.h
blob: 4fcd96ad13be9ad1d641cb9f5f5e2b627894de84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once
#include "String.h"

#include <exception>
#include <optional>
#include <string_view>

namespace cru {
#ifdef _MSC_VER
#pragma warning(disable : 4275)
#endif
class CRU_BASE_API Exception : public std::exception {
 public:
  explicit Exception(std::string message = "",
                     std::unique_ptr<std::exception> inner = nullptr);
  explicit Exception(StringView message,
                     std::unique_ptr<std::exception> inner = nullptr);

  ~Exception() override;

 public:
  [[deprecated("Use GetUtf8Message.")]] String GetMessage() const {
    return String::FromUtf8(message_);
  }

  std::string GetUtf8Message() const { return this->message_; }

  std::exception* GetInner() const noexcept { return inner_.get(); }

  const char* what() const noexcept override;

 protected:
  void SetMessage(std::string message) { message_ = std::move(message); }
  void AppendMessage(std::string_view additional_message);
  void AppendMessage(std::optional<std::string_view> additional_message);

  [[deprecated("Use void SetMessage(std::string message) instead.")]]
  void SetMessage(StringView message);
  [[deprecated("Use void AppendMessage(std::string_view additional_message) instead.")]]
  void AppendMessage(StringView additional_message);
  [[deprecated("Use void AppendMessage(std::optional<std::string_view> additional_message) instead.")]]
  void AppendMessage(std::optional<StringView> additional_message);

 private:
  std::string message_;
  std::unique_ptr<std::exception> inner_;
};

class CRU_BASE_API PlatformException : public Exception {
 public:
  using Exception::Exception;  // inherit constructors

  CRU_DEFAULT_DESTRUCTOR(PlatformException)
};

class CRU_BASE_API TextEncodeException : public Exception {
 public:
  using Exception::Exception;
};

class ErrnoException : public Exception {
 public:
  ErrnoException();
  explicit ErrnoException(int error_code);
  /**
   * @brief will retrieve errno automatically.
   */
  explicit ErrnoException(std::string_view message);
  ErrnoException(std::string_view message, int errno_code);
  /**
   * @brief will retrieve errno automatically.
   */
  explicit ErrnoException(StringView message);
  ErrnoException(StringView message, int errno_code);

  int GetErrnoCode() const { return errno_code_; }

 private:
  int errno_code_;
};
}  // namespace cru