Theolizer
Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
7h.error_report.h
[詳解]
1
//############################################################################
2
/*!
3
@brief ドキュメント・ファイル-使用方法(個別)
4
@ingroup Documents
5
@file 7h.error_report.h
6
@author Yoshinori Tahara
7
@date 2017/05/03 Created
8
*/
9
/*
10
© 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
11
"Theolizer" is a registered trademark of Theoride Technology.
12
13
"Theolizer" License
14
In the case where you are in possession of a valid “Theolizer” License,
15
you may use this file in accordance with the terms and conditions of
16
the use license determined by Theoride Technology.
17
18
General Public License Version 3 ("GPLv3")
19
You may use this file in accordance with the terms and conditions of
20
GPLv3 published by Free Software Foundation.
21
Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
22
A copy of GPLv3 is also saved in a LICENSE.TXT file.
23
24
商用ライセンス
25
あなたが有効なTheolizer商用ライセンスを保持している場合、
26
セオライド テクノロジーの定める使用許諾書の条件に従って、
27
このファイルを取り扱うことができます。
28
29
General Public License Version 3(以下GPLv3)
30
Free Software Foundationが公表するGPLv3の使用条件に従って、
31
あなたはこのファイルを取り扱うことができます。
32
GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
33
またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
34
*/
35
//############################################################################
36
37
38
/*!
39
@page ErrorReport エラー報告
40
ここではTheolizerが検出するエラーの受け取り方とその後処理について説明します。
41
42
<br>
43
//############################################################################
44
@section ErrorReport1 1.Theolizerエラー・クラス
45
//############################################################################
46
47
@subsection ErrorInfo 1-1.ErrorInfoクラス
48
Theolzierのエラーは report.h で定義している theolizer::ErrorInfo クラスで表現します。<br>
49
主な公開メンバは以下の通りです。<br>
50
51
|メンバ名|意味|
52
|--------|----|
53
|theolizer::ErrorType getErrorType() const;|エラー種別コード返却|
54
|theolizer::ErrorKind getErrorKind() const;|エラー分類コード返却|
55
|std::string getString() const;|全エラー情報を含むエラー・メッセージ返却|
56
|bool isError() const;|エラーならtrue|
57
|operator bool() const;|エラーか警告ならtrue|
58
|bool operator!() const;|エラーも警告もないならtrue|
59
60
61
@subsection ErrorType 1-2.ErrorType枚挙型
62
<b>theolizer::ErrorType</b>はenum型で以下のシンボルを持ちます。
63
|シンボル名|意味|
64
|----------|----|
65
|None|エラーでも警告でも無い|
66
|Warning|警告|
67
|Error|エラー|
68
69
@subsection ErrorKind 1-3.ErrorKind枚挙型
70
<b>theolizer::ErrorKind</b>はenum型で以下のシンボルを持ちます。
71
|シンボル名|意味|
72
|----------|----|
73
|Unclassified|未分類|
74
|WrongUsing|使い方間違い|
75
|IOError|I/O動作エラー|
76
|UnknownData|非対応シリアライズ・データ・フォーマット|
77
|UnknownVerson|非対応バージョン(未知のグローバル・バージョン番号)|
78
79
@subsection getString 1-4.ErrorInfoのgetString()のフォーマット
80
ErrorInfoのgetString()で取得できる文字列は次のようなフォーマットです。<br>
81
@code
82
ErrorType(ErrorKind),エラーを検出したインスタンス{ソース・ファイル名(行番号)} : エラー・メッセージ
83
@endcode
84
エラーを検出したインスタンス直後の"{ソース・ファイル名(行番号)}"は可能な時のみ表示されます。
85
86
<b>シリアライザのコンストラクタでエラー検出した時(型チェック・エラー)の例</b><br>
87
@code
88
Error(UnknownData),IntrusiveBase2.mULongLong : Unmatch type.{core_serializer.cpp(1570)}
89
@endcode
90
なお、このエラー・メッセージに含まれるソース・ファイルと行番号は、当該エラーを検出したTheolizerのソースと行番号です。
91
92
<b>THEOLIZER_PROCESS()等のマクロ内でエラー検出した時の例</b><br>
93
@code
94
Error(UnknownData),aInt{test_basic_process.cpp(212)} : Logical Error on stream.
95
@endcode
96
97
<br>
98
//############################################################################
99
@section ErrorReport2 2.Theolizerで検出したエラーの記録
100
//############################################################################
101
102
Theolizerは2種類のエラー記録を持っています。
103
どちらとも複数回エラーか警告が発生した場合、最後のエラーが記録されます。<br>
104
ただし、エラー記録を優先するため、エラー発生後の警告はエラーが解除(resetError)されるまで記録されません。
105
106
@subsection SerializerInstance 2-1.シリアライザのインスタンス
107
シリアライザ・インスタンス毎に当該シリアライザで発生したエラー(もしくは警告)を保持します。<br>
108
警告ではないエラーが発生している場合、シリアライザへの要求は全て処理されず、WrongUsingとなります。<br>
109
回復するためには、ストリームの再同期とresetError()呼び出しが必要です。<br>
110
<br>
111
エラー情報に関するメンバ関数は「@ref MemberFunctions 」を参照下さい。<br>
112
113
@subsection ErrorReporter 2-2.ErrorReporterシングルトン
114
theolizer::ErrorReporterはthread_localなシングルトンですのでスレッド毎に一つだけ存在します。<br>
115
当該スレッドで発生した最後のエラーか警告を保持します。<br>
116
シングルトンですのでコンストラクト、コピー、ムーブできません。<br>
117
<br>
118
以下のstatic関数が公開されています。<br>
119
120
|メンバ名|意味|
121
|--------|----|
122
|static theolizer::ErrorInfo const& getErrorInfo() noexcept;|エラー情報を返却します。|
123
|static bool isError() noexcept;|エラーが発生している時trueを返却します。|
124
|static void resetError() noexcept;|エラー状態を解除します。|
125
126
<br>
127
//############################################################################
128
@section ErrorReport3 3.Theolizerで検出したエラーの通知方法
129
//############################################################################
130
131
シリアライザからのエラー通知方法は2つあります。
132
133
1. 例外許可の場合<br>
134
シリアライザ・コンストラクタのiNoThrowExceptionパラメータをfalse(デフォルト)として、シリアライザをコンストラクトすると例外が許可されます。<br>
135
エラーを検出した時に theolizer::ErrorInfo 例外を throw します。<br>
136
<br>
137
2. 例外禁止の場合<br>
138
シリアライザ・コンストラクタのiNoThrowExceptionパラメータをtrueにして、シリアライザをコンストラクトすると例外が禁止されます。<br>
139
エラーを検出しても例外を投げません。getErrorInfo()等でエラー情報を受け取って下さい。<br>
140
141
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333; border-radius: 10px; background-color: #d0d0d0;">
142
<b>シリアライザにエラー状態が残ったままデストラクトしないで下さい</b><br>
143
エラーの受け取り忘れを防止するため、エラーが発生しているのにresetError()せずにデストラクトするとプログラムを強制終了させていますので、例外を禁止している時は、必ずエラーを受け取りresetError()してからデストラクトするようにして下さい。(@ref ErrorReport6 参照)<br>
144
<br>
145
なお、例外許可時はエラーの受け取り損ないは発生しないためresetError()してなくても強制終了しません。
146
</div>
147
148
<br>
149
//############################################################################
150
@section ErrorReport4 4.エラー状態の回復方法
151
//############################################################################
152
153
シリアライザのエラー状態を解除するには、下記の手順で行います。<br>
154
155
1. シリアライザへ渡しているストリームを同期する。<br>
156
次に読むべきデータ先頭から読み出せる状態にします。<br>
157
この処理はユーザ・プログラムにて行って下さい。<br>
158
<br>
159
2. シリアライザのエラーをリセットする。<br>
160
シリアライザ・インスタンス.resetError()により行います。<br>
161
<br>
162
163
ただし、一般にファイルからの回復時にエラーが発生した時の原因は下記ですので、ファイルへの保存/回復の場合はストリームをオープンしたままエラー回復する操作を行うことは原則としてありません。<br>
164
165
- プログラムのバグ(Theolizerが非対応な変更をしたプログラムで回復しようとした。)
166
- ファイル指定ミス(指定したフォーマットと実際のフォーマットの不一致)
167
- ファイル破壊
168
169
通信による受信時にエラーが発生した時は、再同期することでリカバリすることが可能です。<br>
170
なお、通信回線の同期はTheolizerによるサポートはありません。ユーザ・プログラムにて再同期して下さい。<br>
171
<br>
172
173
<br>
174
//############################################################################
175
@section ErrorReport5 5.エラー・ログ
176
//############################################################################
177
178
TheolizerはTheolizerで検出したエラーをログ・ファイルへ記録する機能をサポートしています。<br>
179
180
@subsection THEOLIZER_ERRORLOG_FILE 5-1.THEOLIZER_ERRORLOG_FILE()マクロの指定方法
181
182
THEOLIZER_ERRORLOG_FILE()マクロをユーザ・プログラム内で1箇所だけ書くことで有効になります。<br>
183
184
グローバル名前空間で以下を記述します。
185
@code
186
THEOLIZER_ERRORLOG_FILE("LogFilePath%1%.log");
187
@endcode
188
189
- "LogFilePath"の部分でエラー・ログのパスを指定します。<br>
190
相対パスで指定した場合、プログラム起動時のカレント・フォルダからの相対になります。<br>
191
<br>
192
- "%1%"はTheolizerがログ・ファイルの番号として使います。<br>
193
ログ・ファイル番号は0開始です。<br>
194
ログ・ファイルはデフォルトでは1MBytesを超えると次のログ・ファイルへ切り替わります。その時、ログ・ファイル番号をインクリメントします。<br>
195
ただし、デフォルトでは最大2個までに制限していますので、ログ・ファイル番号1の次は0のログ・ファイルへ「上書き」します。<br>
196
これにより、ほっておいてもログ・ファイルが無限に増えることを防止しています。<br>
197
<br>
198
- ".log"は自由に指定して下さい。<br>
199
<br>
200
201
@subsection LogFileFormat 5-2.ログ・ファイルのフォーマット
202
203
ログ・ファイルは後処理するのに便利のため簡易的なcsvフォーマットにしています。以下の通りです。<br>
204
205
- 先頭行<br>
206
シーケンシャル番号です。これはログ・ファイルを生成する度に1つ増えます。<br>
207
unsigned型で循環します。<br>
208
<br>
209
- 2行目以降<br>
210
@code
211
,年-月-日,時間:分:秒.mSec,同期待ち時間(uSec),スレッドID,ErrorType(ErrorKind),エラー検出インスタンス : エラー・メッセージ
212
@endcode
213
214
<b>ログ・ファイル例:</b><br>
215
@code
216
0
217
,2017-05-04,13:32:38.671,000001,___________12712,Error(UnknownData),IntrusiveBase2.mULongLong : Unmatch type.{core_serializer.cpp(1570)}
218
,2017-05-04,13:32:38.673,000000,___________12712,Error(UnknownData),IntrusiveBase2.mULongLong : Unmatch type.{core_serializer.cpp(1570)}
219
,2017-05-04,13:32:38.673,000000,___________12712,Error(WrongUsing),mIntrusiveBase2{test_serializer_base02.cpp(91)} : Unmatch type.
220
,2017-05-04,13:32:38.673,000000,___________12712,Error(UnknownData),IntrusiveBase2.mULongLong : Unmatch type.{core_serializer.cpp(1654)}
221
,2017-05-04,13:32:38.674,000000,___________12712,Error(UnknownData),IntrusiveBase2.mULongLong : Unmatch type.{core_serializer.cpp(1654)}
222
,2017-05-04,13:32:38.674,000000,___________12712,Error(WrongUsing),mIntrusiveBase2{test_serializer_base02.cpp(123)} : Unmatch type.
223
@endcode
224
225
@subsection WaitSync 5-3.同期待ち時間について
226
エラー・ログ出力は、マルチ・スレッドに対応しています。<br>
227
他のスレッドがエラー・ログ出力処理中に出力しようとした場合、後から出力する方は待たされます。<br>
228
その待ち時間を uSec で記録します。<br>
229
<br>
230
231
@subsection ThreadId 5-4.スレッドIDについて
232
当該ログを出力したスレッドIDを`std::this_thread::get_id()`で獲得して記録します。<br>
233
234
<br>
235
//############################################################################
236
@section ErrorReport6 6.サンプル・ソース
237
//############################################################################
238
239
<b>サンプル・ソース(source/reference_and_test/basic/test_basic_process.cpp)</b><br>
240
@snippet basic/test_basic_process.cpp ErrorReport
241
242
これの出力は以下のようになります。
243
244
@code
245
exception : Error(UnknownData),aInt{test_basic_process.cpp(241)} : Logical Error on stream.
246
no-exception : Error(UnknownData),ashort{test_basic_process.cpp(256)} : Logical Error on stream.
247
@endcode
248
249
<br>
250
//############################################################################
251
@section ErrorReport7 7.エラー検出の網羅的テスト
252
//############################################################################
253
254
@subsection ErrorReport71 7-1.エラー報告全体
255
テスト用のソース・コードは、source/test_library/reportフォルダに置いています。<br>
256
下記の組合せでテストしています。
257
258
|ソース・ファイル|テスト内容|
259
|----------------|----------|
260
|test_report1.cpp |エラー・ログが適切に保存されること<br>エラー・ログ・ファイルの指定ミス<br>マルチ・スレッドに対応できていること |
261
|test_report1_child.cpp |エラー・ログ・ファイル指定ミスのテスト用の子プロセス |
262
|test_report2.cpp |THEOLIZER_ERRORLOG_FILE未指定 |
263
|test_report3.cpp<br>test_report4.cpp |THEOLIZER_ERRORLOG_FILE多重登録 |
264
|test_report4.cpp |ErrorReproterのAPIテスト |
265
266
@subsection ErrorReport72 7-2.downVersion/upVersionのコンパイル・エラー
267
プリミティブ型とenum型以外のメンバ変数への値設定が禁止できていることをテストしています。
268
269
ソース・コードは、source/reference_and_test/ver3b/test_modify_complex.hにて、ERROR1, ERROR2マクロが定義されている時にコンパイル・エラーになるように定義しています。そして、source/reference_and_test/CMakeLists.txtのver3bERROR1, ver3bERROR2にてコンパイル・エラーが発生することをチェックしています。
270
271
@subsection ErrorReport73 7-3.グローバル・バージョン番号テーブルのエラー検出
272
バージョン・アップに伴い、一度シリアライズ指定したクラスやenum型をソース・コードから完全に削除した場合に、グローバル・バージョン番号テーブルから手動で削除する必要があります。(@ref Basic344 参照。)<br>
273
その削除を忘れた場合にコンパイル・エラーになることを確認しています。
274
275
ソース・コードは、source/reference_and_test/ver3b/test_modify_complex.hにて、ERROR3マクロが定義されている時にコンパイル・エラーになるように定義しています。そして、source/reference_and_test/CMakeLists.txtのver3bERROR3にてコンパイル・エラーが発生することをチェックしています。
276
277
@subsection ErrorReport74 7-4.エラー・リカバリ
278
デシリアライズ中のエラー発生後にリカバリするテストを行っています。
279
Json, BinaryシリアライザのNoTypCheck, TypeCheck, TypeCheckByIndexについて、現バージョンと1つ前のバージョンからの回復についてリカバリできることを確認しています。
280
281
ソース・コードは、source/reference_and_test/ver2a/test_modify_complex.cppのtutoriseModifyComplex()関数です。
282
283
284
*/
Theolizer
source
document
ja
7h.error_report.h
© 2016
Theoride Technology
All Rights Reserved. "Theolizer" is a registered trademark of Theoride Technology.
構築:
1.8.12