連載
Enterprise Library概説

一貫した例外管理機能を実装しよう

―― 例外ポリシーの構築を支援する「Exception Handling Application Block」 ――

市川 龍太(patterns & practices Champion
2005/10/01
Page1 Page2

 前回では、Logging & Instrumentation Application Blockを使ったログ出力機能の実装とカスタム・ログの作成について解説した。

 今回は初めにMicrosoft Patterns & Practices(以下P&P)が提示する例外管理のベスト・プラクティスを紹介し、それを踏まえてException Handling Application Block(以下EHAB)を使った例外ポリシーの構築方法について解説していく。

例外管理のベスト・プラクティス

 「例外管理」とひと口にいっても、アプリケーションの内部で発生した例外に対しては、考慮すべき点がいくつか存在する。

  1. 発生した例外をどのタイミングで捕捉するのか?
  2. 捕捉した例外をどのように処理するのか?
  3. (必要ならば)捕捉した例外をどのように伝播させるのか?

 こういった例外ポリシーは業務によって大きく変わってくるところであり、しかも例外ポリシーの策定を担う設計者の思想や過去の経験なども大きく影響するため、単純には決まらないことが多い。

 そこでP&Pでは、例外ポリシーの策定に対するベスト・プラクティスを提供している。以下にP&Pが示すベスト・プラクティスを簡単に解説する。

●例外を捕捉するタイミング

 例外の捕捉は、以下のいずれかの例外処理を行う場合にのみ実行するべきである。

  • ログの記録のために情報を収集する場合
  • 例外に何らかの関連情報を追加する場合
  • リソースの解放などのクリーンアップ・コードを実行する場合
  • 復旧を試みる場合

 いい換えれば、これらの条件に合致しない場合、つまり例外を捕捉したところで何の後処理も実行する必要がない場合は、呼び出しスタックの後方にある上位レイヤに向かって伝播させていくべきである。むやみにすべての例外を捕捉することはコードの保守性を悪くし、さらにパフォーマンスの観点からも推奨されない。

 例えば、多階層のASP.NET Webアプリケーションにおいて発生した例外については、上記条件に合致しない限り、上位のレイヤへ例外を伝播させ、最上位のレイヤにある集約エラー・ハンドラ(Global.asaxのApplication_Errorメソッドなど)の機能を利用して後処理を行うべきだろう(以下の図を参照)。

想定外の例外発生時には上位のレイヤへ例外を伝播させ、集約エラー・ハンドラにて後処理を行う

●どのように例外を伝播させるか?

 例外を伝播させる方法には以下の3つが存在する。

  1. 例外を自動的に伝播させる
     例外を意図的に無視し、上位のレイヤへ伝播させる

  2. 例外をキャッチ(捕捉)し、例外処理を行ってから再スローする
     例外を捕捉し、ログ出力やリソースの解放などの後処理を行った後、例外から復旧できない場合は上位のレイヤへ再スローする

  3. 例外をキャッチし、ラッピングしてから再スローする
     例外は伝播するにつれ、例外型の具体性が徐々に低下していくため、より具体的な例外にラッピングして呼び出し元の上位レイヤに再スローする

 このうち、3の例外のラッピングを行う場合は注意が必要である。というのも、最初にスローされた例外には例外発生の原因に関する具体的な情報が格納されており、運用時または開発時における問題の特定に役立つことが多い。

 それ故、捕捉した例外を別の例外としてラッピングする場合は、再スローする別の例外のコンストラクタに捕捉した例外をパラメータとして渡し、最初に捕捉した例外を明示的に保存しておく必要があるだろう。

 以上の例外管理のベスト・プラクティスはあくまでも指針であり、実際の業務にそぐわないケースもあると思われるが、例外ポリシーの策定においてある程度の参考にはなるだろう。

 最後に筆者が有益だと思う参考サイトや書籍を以下に紹介する。

 それでは続いてEHABについて解説していくわけだが、今回はEHABの機能説明に入る前に、まずEHABの導入手順から解説していく。

ConfigurationコンソールでEHABの構成を設定する

 EHABをアプリケーションで利用するためには、「The Enterprise Library Configuration Console」(以下Configurationコンソール)でEHABの構成管理設定を行っておく必要がある。

●ConfigurationコンソールでのEHABの追加

 今回は「アプリケーション」ノードに「Exception Handling Application Block」ノードを追加する。

ConfigurationコンソールでのEHABの追加
Configurationコンソールを起動するには、[スタート]メニュー−[プログラム]−[Microsoft patterns & practices]−[Enterprise Library - June 2005]−[Enterprise Library Configuration]をクリックすればよい。ここでは事前に、新規のアプリケーションを追加しておく必要がある。これを行うには、ツールバーの[New Application]をクリックするか、メニューバーから[File]−[New Application]を選択すればよい。これにより「Application1」ノードがTreeViewコントロールのルートにある[Enterprise Library Configuration]ノードの直下に作成されるはずだ。
  EHABを追加する。これを行うには、事前に新規追加しておいた「Application1」ノードの上で右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Exception Handling Application Block]を選択すればよい。これにより「Exception Handling Application Block」ノードが「Application1」ノードの下に追加される。
  「Exception Policy」を追加する。これを行うにはで追加した「Exception Handling Application Block」ノードの上で右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Exception Policy]を選択すればよい。
  ポリシーを設定する例外型を追加する。これを行うにはで追加した「Exception Policy」ノードを右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Exception Type]を選択する。[Type Selector]ダイアログが表示されるので、ポリシーを設定する例外型(今回の例ではSystem.Data.SqlClient名前空間の「SqlException」型)を選択する。
  「Logging Handler」を追加する。これを行うにはで追加した「SqlException」ノードを右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Logging Handler]を選択すればよい。
  EHABと依存関係にある「Configuration Application Block」のノードが自動的に追加される。追加された各ノードのプロパティを設定して、EHABの振る舞いをカスタマイズする(詳細後述)。
  Logging Handlerを追加したことで、依存関係にある「Logging & Instrumentation Application Block」ノードが自動的に追加される。追加された各ノードのプロパティを設定して、例外時のログ出力の振る舞いをカスタマイズする。

●「Exception Handling Application Block」配下の各ノードにおけるプロパティ設定

 以下の表は、上記の各ノードの各プロパティの設定例である。ここでは上図の説明にあるように、SqlException例外(SQL Serverが警告やエラーを返したときに発生する例外)についての設定を行っている。

ノード プロパティ 設定値
Exception Policy Name Exception Policy
SqlException Name SqlException
PostHandlingAction NotifyRethrow
TypeName System.Data.SqlClient.SqlException, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Logging Handler Name Logging Handler
EventID 100
FormatterTypeName Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary..ExceptionHandling, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null
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概説」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間