我有一个方法,如下所示调用组合:
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个动作?
答案 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仍然是多余的。