2017-12-22 18 views
1
private void ProcessData(IProcessor processor) 
{  
    Data data = new Data(); 

    try 
    { 
     processor.Process(data); 
    } 
    catch(Exception e) 
    { 
     CustomCode(e); 
    } 
} 

コンクリートIProcessor processor.Processメソッドの実装:キャッチ例外を複数回 - C#

public void Process(Data data) 
{ 
    try 
    { 
     Thing a = null; 
     a.MakeSomething(); 
    } 
    catch(NullPointerException e) 
    { 
     DoSomething(); 
    } 
} 

私はProcessData()方法やその「試す」ブロック (すべての両方で表示されるすべての例外のCustomCode()方法を実行したいと思います呼び出しスタック内のProcessData()から例外をスローするスタックの最後までのコードは、複数の例外ハンドラで処理する必要があります。この例では、DoSomething()CustomCode()の両方を実行する必要があります)。 これをどうすれば実現できますか?私は "スロー"を加えることができることを知っている。 "DoSomething();"の後に置かれますが、これは、プロセッサのすべての実装におけるすべてのプログラマが、常に "throw;" catch(...)に があり、CustomCode(e)を実行できるようになりました。どういうわけかもっとうまくいくことができますか?私は@Seabizkitコメントに同意

+0

例外に関係なく常にcustomerCodeを実行するには、設計上の欠陥があります。なぜtry catchをprocess()から削除し、processdata()がそれを処理するのをやめてください。例外が処理された場合は、処理するものを選択する必要があります。 – Seabizkit

+1

あなたは* NullReferenceExceptionをキャッチすべきではありません(NPEはjavaです、または独自の例外クラスを持っていますか?)*避けてください。したがって、例外についても*ケア*する必要は全くありません。 – HimBromBeere

+0

Seabizkit別のIPプロセッサの実装があります。そのうちの1つでは、トランザクションをデータベースにコミットします。このトランザクションをコミットした後に例外が発生した場合は、このトランザクションをロールバックします。 各IProcessor実装には、Process(Dataデータ)の処理内容に応じて、別の例外処理コードが必要です。 – Zygmuntix

答えて

1

、あなたはそれを隠すためProcessのcatchブロックの末尾にProcess実装または少なくともthrow;例外でのtry-catchを持ってしたくない場合がありますです悪い習慣。

そうでない場合は、ソリューションは、データが処理されたかどうかをチェックProcessData()finallyのブロックを持っているかもしれません(例えば、特別なフラグが設定された)とされていない場合、それは何かが間違っていたことを意味し、CustomCode()を実行する必要がしかし、あなたはどんな種類の例外があったのか分かりません。次のようなものがあります。

private void ProcessData() 
{  
    Data data = new Data(); 

    try 
    { 
     Processor processor = new Processor(); 
     processor.Process(data); 
    } 
    catch(Exception e) 
    { 
     CustomCode(e); 
    } 

    finally { 
     if (!data.IsProcessed) CustomCode(); 
    } 
} 
+0

私はfinallyブロックの解決策が正しいことに同意します:) – Zygmuntix

1
public void Process(Data data) 
{ 
    try 
    { 
    Thing a = null; 
    a.MakeSomething(); 
    } 
    catch(NullPointerException e) 
    { 
    CustomCode(); 
    DoSomething(); 
    } 
    catch(Exception ex) 
    { 
    CustomCode(); 
} 

}

+0

私はProcessorクラスの多くの実装があるので、ProcessDataメソッドレベルで例外処理を実装したいと思います。あなたを混乱させないように、問題のコードを修正します。 – Zygmuntix