AM Daemon ライブラリリファレンス
Exception.h
[詳解]
1 /// @file
2 /// @brief AM Daemon の例外クラス Exception のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_EXCEPTION_H
7 #define AMDAEMON_EXCEPTION_H
8 
9 #include "amdaemon/env.h"
11 #include "amdaemon/util/misc.h"
12 
13 #include <exception>
14 #include <vector>
15 #include <memory>
16 
17 #if AMDAEMON_ON_MSVC
18 #include <crtdefs.h> // for __FILEW__
19 #endif // AMDAEMON_ON_MSVC
20 
21 namespace amdaemon
22 {
23  // 前方宣言
24  namespace util { class StackTrace; }
25 
26 /// @addtogroup g_exception
27 /// @{
28 
29  /// @brief AM Daemon の例外クラス。
30  ///
31  /// 既定ではライブラリ内で例外が発生するとこのクラスのインスタンスがスローされる。
32  ///
33  /// C++標準の例外情報に加え、例外発生位置やスタックトレースの情報を保持している。
34  /// メンバ関数 #toString によりそれらの情報をまとめて文字列化できる。
35  ///
36  /// Core クラスのメンバ関数
37  /// Core#setExceptionHook を用いてライブラリに例外フック関数を設定することで、
38  /// 例外をスローさせる代わりにこのクラスのインスタンスを受け取って処理することができる。
39  /// 例外をスローしないようにすることもでき、
40  /// その場合のライブラリ側の挙動は例外カテゴリに依存する。
41  /// 詳細は各 @ref ExceptionCategory 列挙値の説明を参照すること。
42  class Exception : public std::exception
43  {
44  public:
45  /// @brief コンストラクタ。
46  /// @param[in] category 例外カテゴリ。
47  /// @param[in] file 例外発生時のファイル名。不明ならば nullptr 。
48  /// @param[in] line 例外発生時のファイル行番号。不明ならば負数。
49  /// @param[in] func 例外発生時の関数名。不明ならば nullptr 。
50  /// @param[in] message 例外発生時の付随メッセージ。無いならば nullptr 。
51  /// @param[in] whatFile 例外メッセージ用のファイル名。不明ならば nullptr 。
52  /// @param[in] whatFunc 例外メッセージ用の関数名。不明ならば nullptr 。
53  ///
54  /// 通常、このコンストラクタを直接呼び出すことはなく、
55  /// AMDAEMON_MAKE_EXCEPTION マクロまたは AMDAEMON_MAKE_EXCEPTION_MSG マクロを
56  /// 用いてインスタンスを生成するか、
57  /// AMDAEMON_RAISE_EXCEPTION マクロまたは AMDAEMON_RAISE_EXCEPTION_MSG マクロを
58  /// 用いて例外を発生させる。
59  Exception(
60  ExceptionCategory category,
61  const wchar_t* file,
62  int line,
63  const wchar_t* func,
64  const wchar_t* message,
65  const char* whatFile,
66  const char* whatFunc);
67 
68  /// @brief コピーコンストラクタ。
69  /// @param[in] src コピー元。
70  Exception(const Exception& src);
71 
72  /// @brief ムーブコンストラクタ。
73  /// @param[in] src ムーブ元。
74  Exception(Exception&& src);
75 
76  /// デストラクタ。
77 Exception() throw();
78 
79  /// @brief コピー代入演算子のオーバロード。
80  /// @param[in] r 右辺値。
81  /// @return 自身の参照。
82  Exception& operator=(const Exception& r);
83 
84  /// @brief ムーブ代入演算子のオーバロード。
85  /// @param[in] r 右辺値。
86  /// @return 自身の参照。
87  Exception& operator=(Exception&& r);
88 
89  /// @brief 例外文字列を取得する。
90  /// @return 例外文字列。
91  const char* what() const override;
92 
93  /// @brief 例外カテゴリを取得する。
94  /// @return 例外カテゴリ。不明ならば ExceptionCategory::Unknown 。
96 
97  /// @brief 例外発生時のファイル名を取得する。
98  /// @return 例外発生時のファイル名。不明ならば空文字列。
99  const wchar_t* getFile() const;
100 
101  /// @brief 例外発生時のファイル行番号を取得する。
102  /// @return 例外発生時のファイル行番号。不明ならば -1 。
103  int getLine() const;
104 
105  /// @brief 例外発生時の関数名を取得する。
106  /// @return 例外発生時の関数名。不明ならば空文字列。
107  const wchar_t* getFunction() const;
108 
109  /// @brief 例外発生時の付随メッセージを取得する。
110  /// @return 例外発生時の付随メッセージ。無いならば空文字列。
111  const wchar_t* getMessage() const;
112 
113  /// @brief 例外発生時のスタックトレース情報を取得する。
114  /// @return 例外発生時のスタックトレース情報。不明ならば空のスタックトレース情報。
115  ///
116  /// - ライブラリをリンクするプロジェクトのリンカオプションで /DEBUG が指定されており、
117  /// かつデバッグ情報を参照可能な状態の場合、
118  /// シンボル名やファイル名を含む完全なスタックトレース情報を取得できる。
119  /// - /DEBUG が指定されていない場合やデバッグ情報を参照できない状態の場合、
120  /// スタックアドレスのみ取得できる。
121  ///
122  /// デバッグ情報は、VC++の既定のリンカオプションではPDBファイルとして出力される。
123  /// このPDBファイルが実行可能ファイルと同じ位置にある場合にデバッグ情報を参照可能となる。
124  const ::amdaemon::util::StackTrace& getStackTrace() const;
125 
126  /// @brief 例外情報を文字列化する。
127  /// @param[in] withoutStackTrace スタックトレースの情報を含めないならば true 。
128  /// @return 例外情報文字列。
129  const wchar_t* toString(bool withoutStackTrace = false) const;
130 
131  private:
132  class Impl;
133 
134  /// pimpl インスタンス。
135  std::unique_ptr<Impl> _impl;
136  };
137 
138  /// @brief 例外を発生させる。
139  /// @param[in] ex 例外。
140  ///
141  /// 例外フック関数が設定されているならばそれを呼び出す。
142  /// そうでなければ標準の例外処理を行い、最後にスローする。
143  ///
144  /// 通常、この関数を直接呼び出すことはなく、
145  /// AMDAEMON_RAISE_EXCEPTION マクロまたは AMDAEMON_RAISE_EXCEPTION_MSG マクロを
146  /// 用いて例外を発生させる。
147  void raiseException(const Exception& ex);
148 
149 /// @}
150 } // namespace amdaemon
151 
152 /// @addtogroup g_exception
153 /// @{
154 
155 #if AMDAEMON_ON_MSVC
156 
157 /// @brief amdaemon::Exception インスタンスを生成する。
158 /// @param[in] cate 例外カテゴリ列挙 ExceptionCategory の列挙値名。
159 #define AMDAEMON_MAKE_EXCEPTION(cate) ¥
160  (::amdaemon::Exception( ¥
161  ::amdaemon::ExceptionCategory::cate, ¥
162  __FILEW__, __LINE__, AMDAEMON_STRING_TO_WIDE(__FUNCSIG__), nullptr, ¥
163  __FILE__, __FUNCSIG__))
164 
165 /// @brief amdaemon::Exception インスタンスを付随メッセージ付きで生成する。
166 /// @param[in] cate 例外カテゴリ列挙 ExceptionCategory の列挙値名。
167 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
168 #define AMDAEMON_MAKE_EXCEPTION_MSG(cate, msg) ¥
169  (::amdaemon::Exception( ¥
170  ::amdaemon::ExceptionCategory::cate, ¥
171  __FILEW__, __LINE__, AMDAEMON_STRING_TO_WIDE(__FUNCSIG__), (msg), ¥
172  __FILE__, __FUNCSIG__))
173 
174 #else // AMDAEMON_ON_MSVC
175 #define AMDAEMON_MAKE_EXCEPTION(cate) ¥
176  (::amdaemon::Exception( ¥
177  ::amdaemon::ExceptionCategory::cate, ¥
178  AMDAEMON_STRING_TO_WIDE(__FILE__), __LINE__, nullptr, nullptr, __FILE__, __func__))
179 #define AMDAEMON_MAKE_EXCEPTION_MSG(cate, msg) ¥
180  (::amdaemon::Exception( ¥
181  ::amdaemon::ExceptionCategory::cate, ¥
182  AMDAEMON_STRING_TO_WIDE(__FILE__), __LINE__, nullptr, (msg), __FILE__, __func__))
183 #endif // AMDAEMON_ON_MSVC
184 
185 /// @brief 例外を発生させる。
186 /// @param[in] cate 例外カテゴリ列挙 ExceptionCategory の列挙値名。
187 #define AMDAEMON_RAISE_EXCEPTION(cate) ¥
188  (::amdaemon::raiseException(AMDAEMON_MAKE_EXCEPTION(cate)))
189 
190 /// @brief 付随メッセージ付きの例外を発生させる。
191 /// @param[in] cate 例外カテゴリ列挙 ExceptionCategory の列挙値名。
192 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
193 #define AMDAEMON_RAISE_EXCEPTION_MSG(cate, msg) ¥
194  (::amdaemon::raiseException(AMDAEMON_MAKE_EXCEPTION_MSG(cate, (msg))))
195 
196 /// @brief ロジック(Logic)例外を発生させる。
197 /// @note 主に引数チェック時に用いられる。
198 #define AMDAEMON_RAISE_LOGIC_EXCEPTION() AMDAEMON_RAISE_EXCEPTION(Logic)
199 
200 /// @brief 付随メッセージ付きのロジック(Logic)例外を発生させる。
201 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
202 /// @note 主に引数チェック時に用いられる。
203 #define AMDAEMON_RAISE_LOGIC_EXCEPTION_MSG(msg) AMDAEMON_RAISE_EXCEPTION_MSG(Logic, (msg))
204 
205 /// @brief オペレーション(Operation)例外を発生させる。
206 /// @note 関数呼び出し手順を誤っている時などに用いられる。
207 #define AMDAEMON_RAISE_OPERATION_EXCEPTION() AMDAEMON_RAISE_EXCEPTION(Operation)
208 
209 /// @brief 付随メッセージ付きのオペレーション(Operation)例外を発生させる。
210 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
211 /// @note 関数呼び出し手順を誤っている時などに用いられる。
212 #define AMDAEMON_RAISE_OPERATION_EXCEPTION_MSG(msg) ¥
213  AMDAEMON_RAISE_EXCEPTION_MSG(Operation, (msg))
214 
215 /// @brief 実行時(Runtime)例外を発生させる。
216 /// @note 実行時の状況によって問題が発生した時に用いられる。
217 #define AMDAEMON_RAISE_RUNTIME_EXCEPTION() AMDAEMON_RAISE_EXCEPTION(Runtime)
218 
219 /// @brief 付随メッセージ付きの実行時(Runtime)例外を発生させる。
220 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
221 /// @note 実行時の状況によって問題が発生した時に用いられる。
222 #define AMDAEMON_RAISE_RUNTIME_EXCEPTION_MSG(msg) AMDAEMON_RAISE_EXCEPTION_MSG(Runtime, (msg))
223 
224 /// 回復不能(Fatal)例外を発生させる。
225 #define AMDAEMON_RAISE_FATAL_EXCEPTION() AMDAEMON_RAISE_EXCEPTION(Fatal)
226 
227 /// @brief 付随メッセージ付きの回復不能(Fatal)例外を発生させる。
228 /// @param[in] msg 付随メッセージ。 const wchar_t* に変換可能でなければならない。
229 #define AMDAEMON_RAISE_FATAL_EXCEPTION_MSG(msg) AMDAEMON_RAISE_EXCEPTION_MSG(Fatal, (msg))
230 
231 /// @}
232 
233 #endif // AMDAEMON_EXCEPTION_H
雑多なインライン関数やマクロを定義するヘッダ。
Daemonライブラリの環境定義を行うヘッダ。
ExceptionCategory
AM Daemon の例外カテゴリ列挙。
Definition: ExceptionCategory.h:17
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
const wchar_t * toString(AimeCommand command)
AimeCommand 列挙値の文字列表現値を取得する。
AM Daemon の例外クラス。
Definition: Exception.h:42
void raiseException(const Exception &ex)
例外を発生させる。
AM Daemon の例外カテゴリ列挙 ExceptionCategory のヘッダ。
AimeErrorCategory getCategory(AimeErrorId id)
AimeErrorId 列挙値に対応する AimeErrorCategory 列挙値を取得する。