从Child方法到Root方法的反向异常

时间:2014-07-24 11:52:21

标签: c# asp.net

我有一个方法,如下所示调用组合:

Void MainMethod()
{
    try
    {
        for(i = 0; i < 10; i++)
        {
            Childmethod_1();
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

Childmethod_1()
{
    try
    {
        Childmethod_2();
    }
    catch(Exception ex)
    {
        Report(ex);
    }
}

Childmethod_2()
{
    try
    {
        [Block of Code]
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

Childmethod_1()中的报告(ex)用于将异常详细信息记录到数据库中。如果Childmethod_2()中出现异常,只要&#39; i&#39;在MainMethod()中:For Loop为4,这个异常是否会阻止其余6个动作?

2 个答案:

答案 0 :(得分:3)

来自throw的{​​{1}} Childmethod_2将从catch抓住Childmethod_1并将其记录到数据库中。那个catch块不会再次抛出它,所以在你的主循环中不会看到异常,它不会被中断。

顺便说一下,

catch(ex)
{
  throw ex;
}

不仅仅是不好的做法,它完全没用。为什么不让异常发生?此外,发送的异常将不完整,您将丢失堆栈跟踪。如果你真的希望这样做,就这样抛出:

catch(ex)
{
  throw;
}

答案 1 :(得分:0)

您的问题的答案取决于Report(ex)方法的实施。如果它没有重新抛出异常,但只将异常数据存储到DB中,那么无论发生异常,都将执行循环的所有迭代。在这种情况下,您可以简化代码(如下所示)。请注意,在这种情况下,您应确保Report(ex)方法不能抛出其他异常(例如访问数据库)。

void MainMethod()
{
    for(i = 0; i < 10; i++)
    {
        Childmethod_1();
    }
}

Childmethod_1()
{
    try
    {
        [Block of Code]
    }
    catch(Exception ex)
    {
        Report(ex);
    }
}

另一方面,如果Report(ex)在将数据存储到DB之后重新引发异常,则异常将在MainMethod的catch块中捕获,并且不会执行其他迭代。在这种情况下,您不能省略MainMethod中的try-catch块。但ChildMethod_2仍然是多余的。