「Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
”Open棟梁”に組み込まれた例外処理の基本方針を説明する。
例外処理の処理フロー †
- 例外処理の処理フローを、コラボレーション図、シーケンス図を使用して示す。
- 例外処理の処理フローは、プログラムの最下層で例外がスローされた場合、
次の流れで例外が伝播し、最上位層に伝わるようになっている。
- フレームワークで用意した「例外の型」毎に、処理フローが個別に設計されている。
- なお、2層C/Sの例外処理の処理フローでは、「業務例外」の場合に、
トランザクションのロールバック & 接続切断をしない(そのまま継続)。
コラボレーション図 †
シーケンス図 †
例外の種類 †
概要 †
例外の型名 †
業務例外 †
業務的なエラーを通知するための例外
システム例外 †
環境上の問題などで発生する例外であるが、アプリケーションに於いて原因を明確にできるもの。
その他、一般的な例外 †
バグや環境上の問題で発生する想定外の例外(ランタイム エラー)。別途、発生原因の調査が必要。
例外の業務続行の可・不可 †
業務例外 †
- 業務続行可能
- 元の画面に戻るか、任意の業務画面まで戻るなどして業務続行。
システム例外 †
- 業務続行不可能
- 汎用エラー画面に遷移して業務を停止する(か、ユーザに確認する)。
その他、一般的な例外 †
- 業務続行不可能
- 汎用エラー画面に遷移して業務を停止する(か、ユーザに確認する)。
例外の種類と、ハンドリングの説明 †
項番 | 例外の種類 | ハンドリングの説明 |
1 | 業務例外 | 業務続行可能なエラー用の例外をスローしたり、ハンドルしたりする。
例えば、以下に列挙した、リトライ可能なエラーは、「業務例外」型を使用して例外をスローし業務を続行する。 ・関連チェック エラー ・更新件数0件(タイムスタンプ アンマッチ) ・追加時のキー重複 ・デッドロック ・ロック・タイムアウト ・コマンド・タイムアウト ・, etc. |
2 | システム例外 | 業務続行不可能なエラー用の例外をスローしたり、ハンドルしたりする。
例えば、以下に列挙した、アプリケーションで検出したが、リトライ不可能 or リトライさせたくないエラーは、 「システム例外」の型を使用して例外をスローし(基本的に)業務を停止する。 ・リトライ不可能な、業務的なデータ不整合などのエラー |
3 | その他、一般的な例外 | ランタイム エラーなど、UPで特別に検知しない例外。この例外が発生した後、 例外の振替など特別な措置を取らない限りリトライ不可能であり、(基本的に)業務を停止する。
ここでのリトライは、「UIからのリトライ」、「プログラム内でのリトライ」の両方を指すが、いずれもトランザクション・ロールバック後のリトライを指す。 (プログラム・レベルのリトライや、同一トランザクション内のリトライは、リトライ回数・間隔を調整したとしても有用になり難いので) |
業務例外 †
B層で発生 †
B層で「業務例外」をスローすると以下の処理が実行される。
- トランザクションをロールバック、DBの切断。
- 終了処理(例外処理)が呼び出される(アクセス ログ出力など)
- P層のイベント処理に正常系の戻り値を戻す(ErrorFlag?がtrue)。
P層で発生 †
P層で「業務例外」をスローすると以下の処理が実行される。
- 終了処理(例外処理)が呼び出される(アクセス ログ出力など)
- 共通エリアにメッセージ表示
システム例外、その他一般的な例外 †
B層で発生 †
B層で「システム例外」、「その他一般的な例外」をスローすると以下の処理が実行される。
- トランザクションをロールバック、DBの切断。
- 終了処理(例外処理)が呼び出される(アクセス ログ出力など)
- P層にそのまま例外を返す(リスローされる)。
P層で発生 †
P層で「システム例外」、「その他一般的な例外」をスローすると以下の処理が実行される。
- 終了処理(例外処理)が呼び出される(アクセス ログ出力など)
- 汎用エラー画面を呼び出し、メッセージを表示する。
- 業務を停止する。
例外の振替処理方式 †
例えば、D層でレコード追加時のキー重複エラー、コマンド タイムアウトなどが発生した場合、
これはデータ プロバイダの提供する例外、すなわち、「その他、一般的な例外」として返される。
これをB層のルートの例外処理で「業務例外」に振り替えれば、P層に正常系の戻り値として例外情報が戻るため、
これから、元の画面に戻るか、業務開始時点の画面まで戻るなどの処理を個別に実装して、
追加時のキー重複、デッドロック、ロックタイムアウト、コマンドタイムアウト.etcのリトライが可能である。
”Open棟梁”の「業務コード親クラス2」のカスタム例外処理部に
- 「その他、一般的な例外」 → 「業務例外」
- 「その他、一般的な例外」 → 「システム例外」
などの例外の振替処理を実装できる。
下図は、「その他、一般的な例外」 → 「業務例外」へ例外を振り替える例外処理方式である。
例外処理の基本方針 †
例外のtry ~ catch †
例外のtry ~ catchは、”Open棟梁”側で処理するため、業務プログラムではtry ~ catchしない。
P層フレームワークを持たないリッチクライアント技術を使用する場合、
- Application.ThreadException?
- Application.UnhandledException?
- Application.DispatcherUnhandledException?
イベントのハンドラを併用する。
エラー メッセージの設定と表示方針 †
- ErrorMessageIDに対応するメッセージの雛形を任意の外部リソースに定義しても良い。
- メッセージの雛形に、String.Formatを使用して個別メッセージを組み込み、メッセージを作成する。
※ メッセージ例:「{0}」に、「{1}」権限がありません。
- その場合、個別メッセージは、「業務例外」をスローする前に設定する。
業務例外 †
- 画面:汎用メッセージ・エリアなど
- ログ:エラー ログではなく、ワーニング ログを出力する。
システム例外 †
- 画面:汎用メッセージ・エリアなど
- ログ:「システム例外」の例外情報をエラー ログに出力する。
その他、一般的な例外 †
- 画面:汎用エラー画面など
- ログ:「その他、一般的な例外」の例外情報をエラー ログに出力する。