6
void function() {
    try
    {
        // do something

        foreach (item in itemList)
        {
            try 
            {
                //do something
            }
            catch (Exception ex)
            {
                throw new Exception("functionB: " + ex.Message);
            }
        }
    }
    catch (Exception ex)
    {
        LogTransaction(ex.Message);
    }
}

こんにちは、forループからその親に例外をスローしたいと思います。現在、forループに例外がある場合、ループは終了します。例外がスローされてもループが続行するように変更する方法はありますか?

4

4 に答える 4

21

いいえ、ループから例外をスローして、それを繰り返し続けることはできません。ただし、例外を配列に保存して、ループの後で処理することができます。このような:

List<Exception> loopExceptions = new List<Exception>();
foreach (var item in itemList)
  try 
  {
    //do something
  }
  catch (Exception ex)
  {
    loopExceptions.Add(ex);
  }

foreach (var ex in loopExceptions)
  //handle them
于 2013-03-27T07:12:32.593 に答える
1

ループ内にtry-catch-blockを構築する必要があり、例外を再度スローしないでください。

于 2013-03-27T07:10:25.527 に答える
0

これはどう?

void function() {
    var IsCompleted = false;
    try
    {
        // do something

        foreach (item in itemList)
        {
            try 
            {
                //do something
            }
            catch (Exception ex)
            {
                throw new Exception("functionB: " + ex.Message);
            }
            var IsCompleted = true;
        }
    }
    catch (Exception ex)
    {
        LogTransaction(ex.Message);
    }

    If (!IsCompleted)
       function();
}
于 2013-03-27T07:21:46.970 に答える
0

構文は、throw実行を中断し、catch構文を使用してスタックを最も近い呼び出し元に「バブルアップ」するように暗黙的に設計されています。

(たとえば)クラシックASPまたはVBスクリプトのように、例外がキャッチされたらループの実行を再開する方法はありません。

重要なのは、例外はまれであると考えられているということです。アプリケーションフローを制御する方法として使用しないでください。

他の何かがエラーを処理できるようにすることが目的の場合は、代わりに、エラーハンドラーを渡すことができるようにコードを構造化する必要があります。

この一例は次のとおりです。

void Process(IEnumerable<object> data, Action<object, Exception> handleError) 
{

    foreach(var o in data) 
    { 
        try 
        { 
            // do something
        }
        catch(Exception ex)
        {
            handleError(o, ex); 
        }
    }
}

そのように呼び出す:

Process(data, (obj, ex) => RequeueForProcessingDueToError(obj.Id, ex.Message)); 

これにより、エラー機能を処理するデリゲートを渡すことができます。デリゲートはさまざまな方法で渡すことができます。たとえば、別のイベントです。

于 2013-03-27T07:28:44.800 に答える