連載
|
Page1
Page2
|
前回では、Logging & Instrumentation Application Blockを使ったログ出力機能の実装とカスタム・ログの作成について解説した。
今回は初めにMicrosoft Patterns & Practices(以下P&P)が提示する例外管理のベスト・プラクティスを紹介し、それを踏まえてException Handling Application Block(以下EHAB)を使った例外ポリシーの構築方法について解説していく。
例外管理のベスト・プラクティス
「例外管理」とひと口にいっても、アプリケーションの内部で発生した例外に対しては、考慮すべき点がいくつか存在する。
- 発生した例外をどのタイミングで捕捉するのか?
- 捕捉した例外をどのように処理するのか?
- (必要ならば)捕捉した例外をどのように伝播させるのか?
こういった例外ポリシーは業務によって大きく変わってくるところであり、しかも例外ポリシーの策定を担う設計者の思想や過去の経験なども大きく影響するため、単純には決まらないことが多い。
そこでP&Pでは、例外ポリシーの策定に対するベスト・プラクティスを提供している。以下にP&Pが示すベスト・プラクティスを簡単に解説する。
●例外を捕捉するタイミング
例外の捕捉は、以下のいずれかの例外処理を行う場合にのみ実行するべきである。
- ログの記録のために情報を収集する場合
- 例外に何らかの関連情報を追加する場合
- リソースの解放などのクリーンアップ・コードを実行する場合
- 復旧を試みる場合
いい換えれば、これらの条件に合致しない場合、つまり例外を捕捉したところで何の後処理も実行する必要がない場合は、呼び出しスタックの後方にある上位レイヤに向かって伝播させていくべきである。むやみにすべての例外を捕捉することはコードの保守性を悪くし、さらにパフォーマンスの観点からも推奨されない。
例えば、多階層のASP.NET Webアプリケーションにおいて発生した例外については、上記条件に合致しない限り、上位のレイヤへ例外を伝播させ、最上位のレイヤにある集約エラー・ハンドラ(Global.asaxのApplication_Errorメソッドなど)の機能を利用して後処理を行うべきだろう(以下の図を参照)。
想定外の例外発生時には上位のレイヤへ例外を伝播させ、集約エラー・ハンドラにて後処理を行う |
●どのように例外を伝播させるか?
例外を伝播させる方法には以下の3つが存在する。
-
例外を自動的に伝播させる
例外を意図的に無視し、上位のレイヤへ伝播させる -
例外をキャッチ(捕捉)し、例外処理を行ってから再スローする
例外を捕捉し、ログ出力やリソースの解放などの後処理を行った後、例外から復旧できない場合は上位のレイヤへ再スローする -
例外をキャッチし、ラッピングしてから再スローする
例外は伝播するにつれ、例外型の具体性が徐々に低下していくため、より具体的な例外にラッピングして呼び出し元の上位レイヤに再スローする
このうち、3の例外のラッピングを行う場合は注意が必要である。というのも、最初にスローされた例外には例外発生の原因に関する具体的な情報が格納されており、運用時または開発時における問題の特定に役立つことが多い。
それ故、捕捉した例外を別の例外としてラッピングする場合は、再スローする別の例外のコンストラクタに捕捉した例外をパラメータとして渡し、最初に捕捉した例外を明示的に保存しておく必要があるだろう。
以上の例外管理のベスト・プラクティスはあくまでも指針であり、実際の業務にそぐわないケースもあると思われるが、例外ポリシーの策定においてある程度の参考にはなるだろう。
最後に筆者が有益だと思う参考サイトや書籍を以下に紹介する。
- NETにおける例外管理
- マネージ・コードのパフォーマンスの向上 ― 例外管理 ―
- ASP.NETパフォーマンスの向上 ― 例外管理 ―
- .NET アプリケーションのパフォーマンスとスケーラビリティのためのアーキテクチャと設計のレビュー ― 例外管理 ―
- .NETエンタープライズWebアプリケーション開発技術大全 vol.3 ASP.NET応用編
それでは続いてEHABについて解説していくわけだが、今回はEHABの機能説明に入る前に、まずEHABの導入手順から解説していく。
ConfigurationコンソールでEHABの構成を設定する
EHABをアプリケーションで利用するためには、「The Enterprise Library Configuration Console」(以下Configurationコンソール)でEHABの構成管理設定を行っておく必要がある。
●ConfigurationコンソールでのEHABの追加
今回は「アプリケーション」ノードに「Exception Handling Application Block」ノードを追加する。
●「Exception Handling Application Block」配下の各ノードにおけるプロパティ設定
以下の表は、上記の各ノードの各プロパティの設定例である。ここでは上図の説明にあるように、SqlException例外(SQL Serverが警告やエラーを返したときに発生する例外)についての設定を行っている。
ノード | プロパティ | 設定値 | ||
Exception Policy | Name | Exception Policy | ||
SqlException | Name | SqlEx |
||
PostHandl |
NotifyRethrow | |||
TypeName | System.Data.SqlClient.SqlException, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | |||
Logging Handler | Name | Logging Handler | ||
EventID | 100 | |||
FormatterT |
Microsoft.Practices.EnterpriseLibrary. |
|||
LogCategory | Trace | |||
Priority | 0 | |||
Severty | Error | |||
Title | Enterprise Library Exception Handling | |||
Exception Handling Application Block配下の各ノードのプロパティに対する設定の例 | ||||
表中の太字の個所がデフォルト設定を変更した設定値である。 |
表中のPostHandlingActionプロパティでは、後述する例外処理を行った後の振る舞いを設定することができる。これによってクリーン・アップ処理などの例外処理を行った後に、捕捉した例外をさらに伝播させるか、そのまま戻り値(bool型)を返却して処理を終えるかを切り替えることができる。
PostHandlingActionプロパティの具体的な設定値の意味を以下の表にまとめた。
設定値 | 説明 |
NotifyRethrow | 例外を再スローせずに戻り値としてtrueを返す |
None | 例外を再スローせずに戻り値としてfalseを返す |
ThrowNewException | 例外を再スローする |
PostHandlingActionプロパティ設定値の一覧 |
以上でEHABを使う準備が整った。次にEHABの機能を一通り説明してから、実際に使ってみることにしよう。
INDEX | ||
連載:Enterprise Library概説 | ||
一貫した例外管理機能を実装しよう | ||
1.例外管理のベスト・プラクティス | ||
2.Exception Handling Application Blockが提供する機能 | ||
「Enterprise Library概説」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|