以下代码应在理想情况下执行标量sql命令:
public object AsScalar()
{
SqlCommand cmd = CreateSqlCommand();
try
{
cmd.Connection.Open();
return cmd.ExecuteScalar();
}
catch (Exception exc)
{
log.Error("Exception caught for command: "+_sql, exc);
}
finally
{
Done(cmd);
}
}
但是,我从Visual Studio 2010收到以下错误:
not all code paths return a value
我认为在try-catch-finally中它始终会执行finally语句,无论是否捕获到异常,但似乎情况并非如此。
为什么在try-finally没有问题的情况下添加catch子句会导致此错误?
答案 0 :(得分:6)
使用catch
子句,如果抛出异常,你就会抓住它,然后不传播出方法......所以执行会到达你的try / catch / finally块的末尾,到达方法的结尾,你就不会返回任何东西 - 哎呀!
当您只有try/finally
语句时, 抛出将从方法中传播出来 - 两者都很好。
如果要重新抛出异常,可以使用:
return
这将修复编译时错误,因为现在没有返回值或传播的异常就无法到达方法的末尾。但是,我一般不鼓励" log / throw / log / throw"链上升 - 它通常更清晰,只是登录顶层,无论最终捕获异常。如果你想添加更多的上下文,你可以将它添加到现有的异常(Exception.Data
属性,虽然它在我的经验中很少使用)或将此异常包装在另一个异常中
答案 1 :(得分:2)
catch
块实际上只是记录一条消息。它永远不会返回任何内容或抛弃异常。因此,一个可能的执行路径是抛出异常,将被记录,然后......没有任何东西被返回。实际上,finally
块将被执行,但那里也没有return
语句。
要解决此问题,您可以退回异常或在catch
块内返回null。我应该提一下,退回通常应该是首选的解决方案。