0

私は例外を処理し、その例外をデータベースに保存しようとしています

Function1()  
{  
    try  
    {  
        for(int i=0;i<dt.rows.count;i++)  
        {  
            Function2();  
        }  
    }  
    catch(exception ex)  
    {  
        saveInDB(ex.message.tostring(),id);  
    }  

}  

Function2()  
{  
    try  
    {  
        function3()  
    }  
    catch(exception ex)  
    {  
        throw ex;  
    }  
}  

Function3()  
{  
    try  
    {  
        function4()  
    }  
    catch(exception ex)  
    {  
        throw ex;  
    }  
}  

Function4()  
{  
    try  
    {  
        code;  
    }  
    catch(exception ex)  
    {  
        throw ex;  
    }  
}  

method4 で例外が発生したとします。それはそれを function3->Function2->function1 にスローし、次に function1 がデータベースに例外を書き込みます。

しかし、DB に例外を書き込んだ後、for ループを続行したいと考えています。

ではどうすればいいのでしょうか?

4

4 に答える 4

1

しかし、DBに例外を書き込んだ後、forループを続けたい

これは、(追加の) try/catch を for ループ内に配置することによってのみ可能です。ループの次のラウンドが独立しており、システムに害がないと確信している場合にのみ、これを行う必要があります。

自問してみてください: 不明なエラーが発生した後でも、ビジネス データをデータベースに書き込む勇気があるでしょうか?

コードがいくつかのベスト プラクティスに違反していることに注意してください。

  • throw ex;スタック トレースをリセットします。に置き換えますthrow;
  • function2 - function4 の catch ブロックが例外に対して何もしない場合は、try/catch を完全に削除します。
于 2013-02-19T09:48:03.607 に答える
1

try-catchforループの本体に入れることができます:

Function1()  
{  
    for(int i=0;i<dt.rows.count;i++)  
    {  
        try  
        {  
            Function2();  
        }  
        catch(Exception ex)  
        {  
            saveInDB(ex.message.tostring(),id);  
        }  
    }
}  

ただし、DB への保存などの IO はかなり信頼性が低い (そして遅い) 場合があることに注意してください。これにより、さらに例外がスローされcatch、ループが破棄される可能性があります。

したがって、スローされたすべての例外をデータ構造に格納し、一度に DB にダンプする方がよい場合があります。このようにして、すべての行に対してループが実行されます。

Function1()  
{
    var errors = new LinkedList<Exception>();
    for(int i=0;i<dt.rows.count;i++)  
    {  
        try  
        {  
            Function2();  
        }  
        catch(Exception ex)  
        {  
            errors.AddLast(ex);
        }  
    }
    if(errors.Count > 0)
    {        
        // now you got all exception in errors and can dump
        // them in one block
    }
}
于 2013-02-19T09:49:23.890 に答える
0

ループ内の例外の後でループを続行する必要がある場合は、以下のようにtry/catchブロックを追加する必要がありwithin the loopます。

try{

    for(int i=0; i<10; i++){
       try{
         //do your work here
       }
       catch (Exception e){
         //write to db here and then it will continue in the for loop
       }
    }

    //rest of the code
}
catch (Exception ex){
  //write to db
}
于 2013-02-19T09:51:06.460 に答える
0

try-catch ブロックが例外をスローする限り、プログラムは続行できません。例外処理後にプログラムを続行したい場合は、次を使用しないことをお勧めします。

throw ex;
于 2013-02-19T09:49:17.317 に答える