Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

”Open棟梁”に組み込まれた例外処理の基本方針を説明する。

例外処理の処理フロー

  • 例外処理の処理フローを、コラボレーション図、シーケンス図を使用して示す。
  • 例外処理の処理フローは、プログラムの最下層で例外がスローされた場合、
    次の流れで例外が伝播し、最上位層に伝わるようになっている。
  • フレームワークで用意した「例外の型」毎に、処理フローが個別に設計されている。
  • なお、2層C/Sの例外処理の処理フローでは、「業務例外」の場合に、
    トランザクションのロールバック & 接続切断をしない(そのまま継続)。

コラボレーション図

クラス構造と例外の伝播

シーケンス図

例外処理の処理フロー

例外の種類

概要

例外の種類の概要図

例外の型名

業務例外

業務的なエラーを通知するための例外

システム例外

環境上の問題などで発生する例外であるが、アプリケーションに於いて原因を明確にできるもの。

その他、一般的な例外

バグや環境上の問題で発生する想定外の例外(ランタイム エラー)。別途、発生原因の調査が必要。

例外の業務続行の可・不可

業務例外

  • 業務続行可能
  • 元の画面に戻るか、任意の業務画面まで戻るなどして業務続行。

システム例外

  • 業務続行不可能
  • 汎用エラー画面に遷移して業務を停止する(か、ユーザに確認する)。

その他、一般的な例外

  • 業務続行不可能
  • 汎用エラー画面に遷移して業務を停止する(か、ユーザに確認する)。

例外の種類と、ハンドリングの説明

項番例外の種類ハンドリングの説明
業務例外業務続行可能なエラー用の例外をスローしたり、ハンドルしたりする。

例えば、以下に列挙した、リトライ可能なエラーは、「業務例外」型を使用して例外をスローし業務を続行する。
・関連チェック エラー
・更新件数0件(タイムスタンプ アンマッチ)
・追加時のキー重複
・デッドロック
・ロック・タイムアウト
・コマンド・タイムアウト
・, etc.
システム例外業務続行不可能なエラー用の例外をスローしたり、ハンドルしたりする。

例えば、以下に列挙した、アプリケーションで検出したが、リトライ不可能 or リトライさせたくないエラーは、
「システム例外」の型を使用して例外をスローし(基本的に)業務を停止する。
・リトライ不可能な、業務的なデータ不整合などのエラー
その他、一般的な例外ランタイム エラーなど、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}」権限がありません。
  • その場合、個別メッセージは、「業務例外」をスローする前に設定する。

業務例外

  • 画面:汎用メッセージ・エリアなど
  • ログ:エラー ログではなく、ワーニング ログを出力する。

システム例外

  • 画面:汎用メッセージ・エリアなど
  • ログ:「システム例外」の例外情報をエラー ログに出力する。

その他、一般的な例外

  • 画面:汎用エラー画面など
  • ログ:「その他、一般的な例外」の例外情報をエラー ログに出力する。

添付ファイル: fileSummaryOfExceptionType.png 462件 [詳細] fileModuleAndExceptionPropagation.png 459件 [詳細] fileChangeException.png 773件 [詳細] fileBusinessSystemException_ElseException.png 654件 [詳細] fileBusinessApplicationException.png 622件 [詳細] fileExceptionSequence.png 1665件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-01 (土) 20:36:09 (780d)