如何处理.net中的异常

时间:2013-02-19 09:45:00

标签: c#

我正在尝试处理异常并在数据库中保存该异常

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-&gt; Function2-&gt; function1,然后function1将在数据库中写入异常。

但在DB中写入异常之后我想继续循环。

那我该怎么办?

4 个答案:

答案 0 :(得分:1)

  

但在DB中写入异常之后我想继续循环

这只能通过在for循环中放入(额外的)try / catch来实现。只有当下一轮循环是独立的并且您确定对您的系统没有任何伤害时,才应该这样做。

问问自己:在出现未知错误后,我是否还敢将业务数据写入数据库?

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

  • throw ex;重置堆栈跟踪。将其替换为throw;
  • 当function2中的catch块 - function4不对异常做任何事情时,完全删除try / catch。

答案 1 :(得分:1)

您可以将try - catch放入for循环体内:

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

答案 2 :(得分:0)

只要任何try-catch块抛出异常,程序就无法继续。 如果您希望您的程序在异常处理后继续,我的建议是不使用:

throw ex;

答案 3 :(得分: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
}