Theolizer
Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
|
ここではTheolizerが検出するエラーの受け取り方とその後処理について説明します。
Theolzierのエラーは report.h で定義している theolizer::ErrorInfo クラスで表現します。
主な公開メンバは以下の通りです。
メンバ名 | 意味 |
---|---|
theolizer::ErrorType getErrorType() const; | エラー種別コード返却 |
theolizer::ErrorKind getErrorKind() const; | エラー分類コード返却 |
std::string getString() const; | 全エラー情報を含むエラー・メッセージ返却 |
bool isError() const; | エラーならtrue |
operator bool() const; | エラーか警告ならtrue |
bool operator!() const; | エラーも警告もないならtrue |
theolizer::ErrorTypeはenum型で以下のシンボルを持ちます。
シンボル名 | 意味 |
---|---|
None | エラーでも警告でも無い |
Warning | 警告 |
Error | エラー |
theolizer::ErrorKindはenum型で以下のシンボルを持ちます。
シンボル名 | 意味 |
---|---|
Unclassified | 未分類 |
WrongUsing | 使い方間違い |
IOError | I/O動作エラー |
UnknownData | 非対応シリアライズ・データ・フォーマット |
UnknownVerson | 非対応バージョン(未知のグローバル・バージョン番号) |
ErrorInfoのgetString()で取得できる文字列は次のようなフォーマットです。
エラーを検出したインスタンス直後の"{ソース・ファイル名(行番号)}"は可能な時のみ表示されます。
シリアライザのコンストラクタでエラー検出した時(型チェック・エラー)の例
なお、このエラー・メッセージに含まれるソース・ファイルと行番号は、当該エラーを検出したTheolizerのソースと行番号です。
THEOLIZER_PROCESS()等のマクロ内でエラー検出した時の例
Theolizerは2種類のエラー記録を持っています。 どちらとも複数回エラーか警告が発生した場合、最後のエラーが記録されます。
ただし、エラー記録を優先するため、エラー発生後の警告はエラーが解除(resetError)されるまで記録されません。
シリアライザ・インスタンス毎に当該シリアライザで発生したエラー(もしくは警告)を保持します。
警告ではないエラーが発生している場合、シリアライザへの要求は全て処理されず、WrongUsingとなります。
回復するためには、ストリームの再同期とresetError()呼び出しが必要です。
エラー情報に関するメンバ関数は「3-1-2.メンバ関数 」を参照下さい。
theolizer::ErrorReporterはthread_localなシングルトンですのでスレッド毎に一つだけ存在します。
当該スレッドで発生した最後のエラーか警告を保持します。
シングルトンですのでコンストラクト、コピー、ムーブできません。
以下のstatic関数が公開されています。
メンバ名 | 意味 |
---|---|
static theolizer::ErrorInfo const& getErrorInfo() noexcept; | エラー情報を返却します。 |
static bool isError() noexcept; | エラーが発生している時trueを返却します。 |
static void resetError() noexcept; | エラー状態を解除します。 |
シリアライザからのエラー通知方法は2つあります。
シリアライザのエラー状態を解除するには、下記の手順で行います。
ただし、一般にファイルからの回復時にエラーが発生した時の原因は下記ですので、ファイルへの保存/回復の場合はストリームをオープンしたままエラー回復する操作を行うことは原則としてありません。
通信による受信時にエラーが発生した時は、再同期することでリカバリすることが可能です。
なお、通信回線の同期はTheolizerによるサポートはありません。ユーザ・プログラムにて再同期して下さい。
TheolizerはTheolizerで検出したエラーをログ・ファイルへ記録する機能をサポートしています。
THEOLIZER_ERRORLOG_FILE()マクロをユーザ・プログラム内で1箇所だけ書くことで有効になります。
グローバル名前空間で以下を記述します。
ログ・ファイルは後処理するのに便利のため簡易的なcsvフォーマットにしています。以下の通りです。
ログ・ファイル例:
エラー・ログ出力は、マルチ・スレッドに対応しています。
他のスレッドがエラー・ログ出力処理中に出力しようとした場合、後から出力する方は待たされます。
その待ち時間を uSec で記録します。
当該ログを出力したスレッドIDをstd::this_thread::get_id()
で獲得して記録します。
サンプル・ソース(source/reference_and_test/basic/test_basic_process.cpp)
これの出力は以下のようになります。
テスト用のソース・コードは、source/test_library/reportフォルダに置いています。
下記の組合せでテストしています。
ソース・ファイル | テスト内容 |
---|---|
test_report1.cpp | エラー・ログが適切に保存されること エラー・ログ・ファイルの指定ミス マルチ・スレッドに対応できていること |
test_report1_child.cpp | エラー・ログ・ファイル指定ミスのテスト用の子プロセス |
test_report2.cpp | THEOLIZER_ERRORLOG_FILE未指定 |
test_report3.cpp test_report4.cpp | THEOLIZER_ERRORLOG_FILE多重登録 |
test_report4.cpp | ErrorReproterのAPIテスト |
プリミティブ型とenum型以外のメンバ変数への値設定が禁止できていることをテストしています。
ソース・コードは、source/reference_and_test/ver3b/test_modify_complex.hにて、ERROR1, ERROR2マクロが定義されている時にコンパイル・エラーになるように定義しています。そして、source/reference_and_test/CMakeLists.txtのver3bERROR1, ver3bERROR2にてコンパイル・エラーが発生することをチェックしています。
バージョン・アップに伴い、一度シリアライズ指定したクラスやenum型をソース・コードから完全に削除した場合に、グローバル・バージョン番号テーブルから手動で削除する必要があります。(3-4-4.クラスやenum型を削除する際の注意事項 参照。)
その削除を忘れた場合にコンパイル・エラーになることを確認しています。
ソース・コードは、source/reference_and_test/ver3b/test_modify_complex.hにて、ERROR3マクロが定義されている時にコンパイル・エラーになるように定義しています。そして、source/reference_and_test/CMakeLists.txtのver3bERROR3にてコンパイル・エラーが発生することをチェックしています。
デシリアライズ中のエラー発生後にリカバリするテストを行っています。 Json, BinaryシリアライザのNoTypCheck, TypeCheck, TypeCheckByIndexについて、現バージョンと1つ前のバージョンからの回復についてリカバリできることを確認しています。
ソース・コードは、source/reference_and_test/ver2a/test_modify_complex.cppのtutoriseModifyComplex()関数です。