从子方法重新抛出异常到根方法
本文关键字:方法 抛出异常 子方法 | 更新日期: 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_2
的throw
将被来自Childmethod_1
的catch
捕获并记录到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仍然是多余的。