从子方法重新抛出异常到根方法

本文关键字:方法 抛出异常 子方法 | 更新日期: 2023-09-27 18:14:39

我有一个方法调用combo如下:

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()中的

Report(ex)用于将异常详细信息记录到Database中。如果在Childmethod_2()中发生异常,每当MainMethod()中的'i': For循环为4时,这个异常会阻止其余的6个动作吗?

从子方法重新抛出异常到根方法

来自Childmethod_2throw将被来自Childmethod_1catch捕获并记录到DB中。该catch块不会再次抛出异常,因此在主循环中不会看到异常,主循环也不会被中断。

顺便说一下,

catch(ex)
{
  throw ex;
}

不仅是不好的做法,而且完全没有用处。为什么不让异常发生呢?此外,发送的异常将不完整,您将失去堆栈跟踪。如果你真的想这样做,就像这样输入:

catch(ex)
{
  throw;
}

这个问题的答案取决于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仍然是多余的。