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;  
    }  
}  

假设我在方法 4 中遇到异常,那么它将把它扔给 function3->Function2->function1,然后 function1 将在数据库中写入异常。

但在数据库中写入异常后,我想继续循环。

那我该怎么办?

4

4 回答 4

1

但是在数据库中写入异常后,我想继续循环

这只能通过在 for 循环中放置一个(额外的)try/catch 来实现。只有在下一轮循环是独立的并且您确定不会对您的系统造成损害时,您才应该这样做。

扪心自问:出现未知错误后,我还敢将业务数据写入数据库吗?

请注意,您的代码违反了一些最佳实践:

  • throw ex;重置堆栈跟踪。将其替换为throw;
  • 当 function2 - function4 中的 catch 块对异常不做任何事情时,完全删除 try/catch。
于 2013-02-19T09:48:03.607 回答
1

您可以将try-catch放入for循环的主体中:

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

但是请记住,诸如保存到数据库之类的 IO 可能非常不可靠(而且速度很慢)。这反过来可能会导致在您的 中引发进一步的异常catch,这将破坏您的循环。

因此,最好将所有抛出的异常存储在数据结构中并立即将它们转储到数据库中。这样循环就为每一行运行。

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/catchwithin 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 回答