Try-Catch-Finally并非所有代码路径都返回一个值

时间:2014-05-01 20:20:23

标签: c# sql

以下代码应在理想情况下执行标量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子句会导致此错误?

2 个答案:

答案 0 :(得分:6)

使用catch子句,如果抛出异常,你就会抓住它,然后传播出方法......所以执行会到达你的try / catch / finally块的末尾,到达方法的结尾,你就不会返回任何东西 - 哎呀!

当您只有try/finally语句时, 抛出将从方法中传播出来 - 两者都很好。

如果要重新抛出异常,可以使用:

return

这将修复编译时错误,因为现在没有返回值或传播的异常就无法到达方法的末尾。但是,我一般不鼓励" log / throw / log / throw"链上升 - 它通常更清晰,只是登录顶层,无论最终捕获异常。如果你想添加更多的上下文,你可以将它添加到现有的异常(Exception.Data属性,虽然它在我的经验中很少使用)或将此异常包装在另一个异常中

答案 1 :(得分:2)

catch块实际上只是记录一条消息。它永远不会返回任何内容或抛弃异常。因此,一个可能的执行路径是抛出异常,将被记录,然后......没有任何东西被返回。实际上,finally块将被执行,但那里也没有return语句。

要解决此问题,您可以退回异常或在catch块内返回null。我应该提一下,退回通常应该是首选的解决方案。