2011-12-19 6 views
2

XMLファイルを解析するプロセスがあります。カスタム例外によるプログラムフロー

これはPAckageクラスで発生しています。

パッケージのクラスは無効な状態にオブジェクトを設定し、私はパッケージに渡されるfilitemを示しています簡単にするためにパッケージクラス

を発生したエラーに関する詳細な情報をキャプチャする委任を持っている...は、

すなわち `パッケージ内

foreach(var package in Packages) 
{ 
try 
{ 

    package.ProcessXml(fileitem.nextfile); 

} 
catch (CustomeErrorException ex) 
{ 
    Logger.LogError(ex) 
} 
} 

は私の検証は、この

のようなものを見てこの検証では
var Album = xml.Descendants() 
    .Select(albumShards => new Album { 
     Label = (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "" ? 
FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum) : (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() 

私は「」ラベルに返された場合...その場合は、エラー情報をFailpackageを呼び出し、含むのtry catchブロック

を介して捕捉される例外

protected override void FailPackage(string msg, LogItem logItem) 
     { 
      Valid = ProcessState.Bad; 
      Logger.LogError(msg,logItem); 
      throw CustomErrorException(msg, Logitem); 

     } 

を作成するかを確認し

私の懸念は、プログラムフローの例外を使用していることです。この問題に近づくにはどうすればよいのでしょうか、これは有効なパターンです。

+0

ラベルが空でどのくらいの頻度? – Amy

+0

それはエラーではない... – HoopSnake

答えて

2

ProcessXmlは、特定のケースでその名前が意味することを実行できません。これらはエラーの場合です。名前の意味にかかわらず、例外はエラー処理のためのものです。例外に関する最大の誤解の

一つは、彼らがために であるということです「例外条件。」現実は、彼らが 通信エラー条件のためであるということです。

クシシュトフ・クワリーナ、Framework Design Guidelines:規則、イディオム、および再利用可能な.NETライブラリ言い換えれば

ためのパターンは、あなたが右にいます。 :)

優れたガイドラインについては、上記の本の例外に関する章をお読みください。

+2

"例外的な条件"対 "エラー"の意味が時にはあまりにも多すぎると思う。 「例外条件」という用語を使用する人は、例外を投げずに簡単かつ迅速に処理できる一般的なエラー発生のたびに例外を使用することに注意するだけです。たとえば、ユーザーの入力がゼロ除算を引き起こさないように例外に頼るのではなく、ユーザーにプロンプ​​トを出します。 –

+0

@AndrewBarber - 公正なポイント。これは本書にも記載されています。 :) – TrueWill

0

あなたはProcessStateと一緒にエラーを置くことができます。

foreach(var package in Packages) 
{ 
    package.ProcessXml(fileitem.nextfile); 
    if(!package.Valid) 
     Logger.LogError(package.Error) 
} 



var albumShards = xml.Descendants().FirstOrDefault(); 
if((string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "") 
    return FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum); 

album = (string)albumShards.Descendants(TempAlbum.LabelLoc); 


protected override void FailPackage(string msg, LogItem logItem) 
{ 
    Valid = ProcessState.Bad; 
    Logger.LogError(msg,logItem); 
    Error = msg; 
} 
+0

また、既にFailPackageメソッドにログインしています。他のログを追加して、その例外をスローしないで静かに失敗することができます。 – ivowiblo