调试生产代码我遇到了一些我以前没见过的东西,并且我没有意识到有效的目的。在我们的一个控制器的几种方法中,我们有try-catch块。有趣的是,其中一个捕获中有2个抛出语句。
有没有理由有2个投掷声明?如果是这样,那在什么情况下才有意义呢?
try
{
//statements
}
catch (SoapException se)
{
//Log statement
return null;
}
catch (Exception ex)
{
//Log statement
throw;
throw;
}
答案 0 :(得分:10)
没有理由throw
两次。永远不会达到第二个throw
。
它也类似于
public int GetNumber()
{
return 1;
return 2; // Never reached
}
<强>更新强>
Resharper是检查此类内容的绝佳工具。
在这种情况下,它会使第二个throw
变灰并告诉你它无法访问。
答案 1 :(得分:3)
连续两次抛出异常绝对没有任何意义。永远无法达到第二个throw
,它很可能是一个错字,或编辑过的代码,但从未完成,因此被遗忘。
答案 2 :(得分:3)
在您展示的示例中,两个throw语句没有任何意义。一旦第一个被击中,它就会开始恢复调用堆栈,直到它被捕获为止。两个人做出任何分歧的唯一方法是,如果第一个是有条件的,或者在第二个被击中之前被捕获。
try
{
//statements
}
catch (SoapException se)
{
//Log statement
return null;
}
catch (Exception ex)
{
//Log statement
if (condition)
throw;
throw;
}
或
try
{
//statements
}
catch (SoapException se)
{
//Log statement
return null;
}
catch (Exception ex)
{
//Log statement
try
{
throw;
}
catch (Exception)
{
//Handle first thrown exception.
}
throw;
}