4

try-catch ブロックにラップしたい C# メソッドがいくつかあります。各関数は、キャッチに対して同じロジックを持ちます。これらの関数のそれぞれにデコレータを追加して、すべて同じ try/catch ブロックでラップするエレガントな方法はありますか? これらすべての関数に try/catch ブロックを追加したくありません。

例:

public void Function1(){
   try {
     do something
   }catch(Exception e) {
      //a BUNCH of logic that is the same for all functions
   }
}

public void Function2() {
   try {
     do something different
   }catch(Exception e) {
      //a BUNCH of logic that is the same for all functions
   }
}
4

2 に答える 2

14

これに対する機能的な解決策はどうですか?throw;元のスタック トレースを保持したまま例外を再スローする例外と use ステートメントを飲み込まないことに注意してください。黙って例外を飲み込まないでください。これは非常に悪い習慣であると考えられており、デバッグ コードは恐ろしいものになります。

void Main()
{
    WrapFunctionCall( () => DoSomething(5));
    WrapFunctionCall( () => DoSomethingDifferent("tyto", 4));
}

public void DoSomething(int v){ /* logic */}

public void DoSomethingDifferent(string v, int val){ /* another logic */}

public void WrapFunctionCall(Action function) 
{
    try
    {
        function();
    }
    catch(Exception e)
    {
         //a BUNCH of logic that is the same for all functions
         throw;
    }
}

何らかの値を返す必要がある場合、WrapFunctionCallメソッドの署名が変更されます

void Main()
{
    var result = WrapFunctionCallWithReturn( () => DoSomething(5));
    var differentResult = WrapFunctionCallWithReturn( () => DoSomethingDifferent("tyto", 4));
}

public int DoSomething(int v){ return 0; }

public string DoSomethingDifferent(string v, int val){ return "tyto"; }

public T WrapFunctionCallWithReturn<T>(Func<T> function) 
{
    try
    {
        return function();
    }
    catch(Exception e)
    {
        //a BUNCH of logic that is the same for all functions
        throw;
    }
}
于 2013-03-28T14:45:18.263 に答える
2

これは、回答として言い換えられた Joel Etherton のコメントです。これは最善の解決策ではないことに注意してください (より良い解決策については、Ilya Ivanov の回答を参照してください)。
しかし、それは簡単です。私があなたの質問を正しく読んだ場合、それはまさにあなたが求めていたものです:

void errorHandling(Exception e)
{
  // Your BUNCH of logic
}

public void Function1(){
   try {
     do something
   }catch(Exception e) {
      errorHandling(e);
   }
}

public void Function2() {
   try {
     do something different
   }catch(Exception e) {
      errorHandling(e);
   }
}
于 2013-03-28T15:08:51.997 に答える