2

私がこのようなものを持っているとしたらどうなりますか?

public static void DoSomething()
{
  try
  { 
    //some code
    try
    {
      //some other code
    }
    catch (Exception e)
    {
      log.Error("At the end something is wrong: " + e);
      FunctionA(); //same function as in the first exception
    }
  }
  catch (Exception e)
  {
    log.Error("At the start something wrong: " + e);
    FunctionA();
  }
}

だから私は別の人を捕まえることを試みます。例外は異なるはずであり、ロガーを変えてそれらを処理したいと思います。しかし、両方の例外に対して同じ関数を呼び出したいとしましょう。FunctionA()私は2回書かなければなりません。これで大丈夫ですか?または、このタイプの例外に他の問題がありますか?提案?

4

4 に答える 4

2

複数のcatchブロックで単一のtryブロックを使用できます。また、finallyステートメントを使用して、例外があるかどうかに関係なく、コードセクションを実行できます。

関数内で複数のtry-catchブロックを使用することは、一般的には良い考えではありません。また、発生した場所で例外を処理することをお勧めします。

public static void DoSomething()
{
  try
  { 
    //some code
  }

  catch (ExceptionA e)
  {
    // exception is ExceptionA type
    log.Error("At the end something is wrong: " + e);
    FunctionA(); //same function as in the first exception    
  }
  catch (ExceptionB e)
  {
    // exception is ExceptionB type
    log.Error("At the start something wrong: " + e);
    FunctionA(); //same function as in the first exception    
  }
  finally
  {
        //you can do something here whether there is an exception or not
  }
}
于 2012-08-31T08:12:00.460 に答える
1

したがって、すべての例外的な場合にメソッドを呼び出す必要があります。次にBoolean、すべてが正常に実行されたかどうかを格納するために変数を使用します。FunctionA次に、それに応じて最後に呼び出すことができます:

public static void DoSomething()
{
    bool success = true;
    try
    {
        //some code
        try
        {
            //some other code
        } catch (Exception ex)
        {
            success = false;
            try
            {
                //some other code
            } catch (ExceptionA eA)
            {
                log.Error("At the end, something went wrong: " + eA);
            } catch (ExceptionB eB)
            {
                log.Error("At the end, something else went wrong: " + eB);
            }
        }
    } catch (Exception ex)
    {
        success = false;
        log.Error("At the start something wrong: " + ex);
    }

    if(!success)
        FunctionA();
}

ただし、いずれにせよこのメソッドを呼び出したい場合、つまり、例外が発生したかどうかに関係なく、を使用できますfinally。リソースをクリーンアップする場合にも役立ちます。

于 2012-08-31T08:15:45.073 に答える
0

DoSomthingこのような例外を再スローするように変更した場合、

public static void DoSomething()
{
  try
  { 
    //some code
    try
    {
      //some other code
    }
    catch (Exception e)
    {
      log.Error("At the end something is wrong: " + e);
      throw;
    }
  }
  catch (Exception e)
  {
    log.Error("At the start something wrong: " + e);
    throw;
  }
}

例外をログに記録することは実際にはそれを処理しないので、これはある程度意味FunctionAがあります。を呼び出すとDoSomething、どちらの例外もキャッチできます。

static void CallDoSomething()
{
    try
    {
       DoSomething();
    }
    catch
    {
       FunctionA();
    }
}

または、本当に同じ機能で実行したい場合。

public static void DoSomething()
{
    try
    {
        try
        { 

            // some code

            try
            {

                // some other code

            }
            catch (Exception e)
            {
                log.Error("At the end something is wrong: " + e);
                throw;
            }
        }
        catch (Exception e)
        {
            log.Error("At the start something wrong: " + e);
            throw;
        }
    }
    catch (Exception) // I include the type in the hope it will be more derived.
    {
        FunctionA();
    }
}
于 2012-08-31T08:26:46.210 に答える
0

コードを再利用可能なメソッドに入れることができます。

public void LogIfSomeException(Action action, string message)
{
    try
    {
        action();
    }
    catch (SomeException e)
    {
        log.Error(message + e);
        FunctionA();
    }
}

次のように使用できます:

public static void DoSomething()       
{
    LogIfSomeException(() => {
       // start code
       LogIfSomeException(() => {
          // end code
       }, "At the end something is wrong");
    }, "At the start something is wrong");

} 
于 2012-08-31T08:20:39.010 に答える