まず、例外の設計ガイドラインから始めましょう。DO、DO NOT、AVOIDが含まれています。また、理由も示します。
あなたの例の場合、revelventセクションはWrapping Exceptionsです
そして、それがこのように書かれることを期待するでしょう。特定の例外をキャッチし、より意味のあるメッセージが伝播されるように情報を追加しようとすることに注意してください。また、ロギングの目的で内部例外が維持されていることに注意してください
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
UPDATE
Kaniniは、この例外ブロックをデータレイヤーに入れるのが正しいのか、またはファイルのチェックをビジネスレイヤーで利用できるようにするのが正しいのかを尋ねます。
まず、例外をラッピングする理由は次のとおりです。
下位層の例外が上位層の操作のコンテキストで意味をなさない場合は、下位層からスローされた特定の例外をより適切な例外にラップすることを検討してください。
したがって、ファイルについて上位層が知っている必要があると感じる場合、データ層は次のようになります。
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
キャッチしようとしない。
個人的には、データレイヤーがアセンブリリソースであるデフォルトのsystems.xmlを使用するような便利なことを実行できない限り、何もしないか、例外をラップすることは、どのメソッドとどのファイルが問題であるかをログに記録するので良い方法だと思います。(throw ex
この場合、または優先される場合でも、throw
値は追加されません)。これは、特定されると、問題を迅速に修正できることを意味します。
また、この特定の例には、XDocument.Loadが4つの例外をスローする可能性があるという点で、次の問題もあります。
- ArgumentNullException
- SecurityException
- FileNotFoundException
- UriFormatException
次のコードがFileNotFoundExceptionをスローしないことを安全に保証することはできません。単に、存在チェックを行ったときに存在し、ロードを行ったときに消失する可能性があるからです。それをビジネスレイヤーで使用できるようにすることは役に立ちません。
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityExceptionはさらに悪化します。これは、別のプロセスグラブが排他的なファイルロックを持っている場合にスローされる他の理由の中で、File.CanIOpenThis()メソッドがないため、読み取りのために開いてみるまでエラーを受け取らないからです。そして、そのような方法が存在する場合、File.Existsの場合と同じ問題がまだあります。