2016-06-20 11 views
0

私のプロジェクトの要件は、特定のディレクトリ内のファイルを解析するスロー。 MyDirectory、MyFiles、MyRecords、MyFieldsのようなクラスを作成しました。これは基本的に私のデータのメモリ内表現です。私は例外処理の助けが必要です。例外をログに記録し、画面にエラーを表示したいMyFieldsクラスレベルで例外が発生した場合は、CustomErrorStringにフィールド名を追加したい場合は、MyRecordsクラスに例外をスローします。その例外をMyRecordsクラスでcatchして、レコード番号をCustomErrorStringに追加し、MyFilesクラスに同じ例外をスローします。 MyFilesクラスの例外をキャッチしてCustomErrorStringなどにファイル名を追加してください...あなたはどのようにカスタム例外処理クラスを作成するか、さまざまなクラスでそれを処理し、また一般的なsystem.Exceptionを処理する方法を教えていただけますか?カスタム例外をスローして情報を収集し、再び

答えて

0

カスタム例外を作成できます。例えば、このような単純なもの:

public class MyException : Exception 
{ 
    public string SomeProperty { get; set; } 

    public MyException(string message, string someProperty, Exception innerException) 
     : base(message, innerException) 
    { 
     SomeProperty = someProperty; 
    } 
} 

任意の例外をキャッチすると、あなたは内部例外として、元の設定後、ラップカスタム1でその例外は、次のことができます。

catch (Exception ex) 
{ 
    throw new MyException("Custom error message", "Custom info", ex); 
} 

ますもちろんcatchブロックで好きなことをすることもできます。ログ情報など。そして、あなたはカスタム例外とそのコンストラクタを設計することができます。

ここで重要な点は、元の例外を変更しないで、新しい例外のプロパティとして保持することです。例外に情報を追加したいスタック内の各レイヤーは、それ自身の例外をラップすることによってそれを行う必要があります。このレイヤーは、好きなカスタムプロパティを持つことができます。

+0

Davidさんありがとうございます。あなたはあなたの最後の段落を精緻化できますか?元の例外の価値をどのように保持できますか? MyExceptionクラスのpublic static StringBuilder MyCustomError varibleのようなものを作成し、呼び出された関数をキャッチするときに文字列を追加する必要がありますか? – bansi

+0

@bansi:元の例外を '.InnerException'プロパティ(これは' base() 'コンストラクタがこの例で使用したものです)に設定すると、元の例外が保持されます。たとえば、スタックで3回実行すると、合計で4つの例外が発生します。それぞれの例外は別の例外のプロパティです。 – David

関連する問題