【问题标题】:C# error "Not all code paths return a value"C# 错误“并非所有代码路径都返回值”
【发布时间】:2023-03-20 12:05:01
【问题描述】:

我将这部分代码从 vb 翻译成 c# 并给了我这个错误信息。 “并非所有代码路径都返回值”。问题是什么?提前致谢。

    public DataSet LoadSearchDataSet(string strConnection, string strSQL)
    {

        //The purpose of this function is to create and populate a data
        //set based on a SQL statement passed in to the function.

        try
        {
            DataSet dsData = new DataSet();
            //call the table in the local dataset "results" since the values
            //may be coming from multiple tables.
            string strTableName = "Results";
            bool blnRunStoredProc = false;
            dsData = PopulateDataSetTable(strConnection, strTableName, strSQL, blnRunStoredProc, dsData);

            WriteSampleDataToOutputWindow(dsData);

            //return the data set to the calling procedure
            return dsData;
        }
        catch
        {
            //error handling goes here
            UnhandledExceptionHandler();
        }
    }

【问题讨论】:

  • 问题正如编译器所说的那样 - 并非所有代码路径都返回一个值。如果你捕捉到一个异常,你期望会发生什么?你打电话给UnhandledExceptionHandler,但是你期望得到什么?
  • 你的catch语句也必须返回一个值!或者将返回值放在try catch之外
  • 你需要在那个捕获中投掷(或某种形式的回报)

标签: c#


【解决方案1】:

如果代码抛出异常,您会丢失返回值。

public DataSet LoadSearchDataSet(string strConnection, string strSQL)
{
    //The purpose of this function is to create and populate a data
    //set based on a SQL statement passed in to the function.

    DataSet dsData = new DataSet();

    try
    {
        //call the table in the local dataset "results" since the values
        //may be coming from multiple tables.
        string strTableName = "Results";
        bool blnRunStoredProc = false;
        dsData = PopulateDataSetTable(strConnection, strTableName, strSQL, blnRunStoredProc, dsData);

        WriteSampleDataToOutputWindow(dsData);
    }
    catch
    {
        //error handling goes here
        UnhandledExceptionHandler();
    }

     //return the data set to the calling procedure
     return dsData;
}

【讨论】:

    【解决方案2】:

    如果在 return 语句之前的 try 块中发生异常,则执行 catch 并且不会返回任何内容,因为您没有告诉它。

    您可以执行以下操作之一:

    • catch 块返回一个值。只有当它有意义并且你有一个可以返回的合理价值时才这样做。请注意,返回null 是常见的错误来源,而patterns 可以避免这种情况。
    • 如果您此时无法对它执行任何操作,则重新抛出发生的异常(并返回一个有意义的对象)。您可以通过添加以下内容来执行此操作:throw;
    • 引发其他错误 - 您可以将原始异常打包到一个新异常中,并在必要时提供有关上下文的额外详细信息。

    【讨论】:

      【解决方案3】:

      你需要在你的 catch 子句之后添加一个 return 语句!

      如果您的 try catch 子句中出现异常,您将不会返回值。这正是您的错误所表明的。

      【讨论】:

        【解决方案4】:

        这是函数中的常见错误消息,因为函数旨在返回一些值。如果您的代码通过了 catch 部分,它将到达函数的末尾而不返回任何内容,这就是您需要返回值的地方。

        【讨论】:

          【解决方案5】:

          这样改写:

              DataSet dsData = null;
              try
                      {
                          //call the table in the local dataset "results" since the values
                          //may be coming from multiple tables.
                          string strTableName = "Results";
                          bool blnRunStoredProc = false;
                          dsData = PopulateDataSetTable(strConnection, strTableName, strSQL, blnRunStoredProc, dsData);
          
                          WriteSampleDataToOutputWindow(dsData);
                      }
                      catch
                      {
                          //error handling goes here
                          UnhandledExceptionHandler();
                      }
          //return the data set to the calling procedure
                          return dsData;
          

          【讨论】:

            【解决方案6】:

            您可以通过以下方式解决此问题:

            1. 将函数返回更改为 VOID(如果您没有返回某些内容)
            2. 在结束函数之前用变量名给出返回关键字

            【讨论】:

              【解决方案7】:

              这是因为在任何异常发生的情况下,异常都会被抛出到catch,这样代码就不会返回任何值。所以你必须从 catch 中返回一些值来避免这个问题

              用这个替换catch:

                      catch
                      {
                          //error handling goes here
                          UnhandledExceptionHandler();
                          return new DataSet();
                      }
              

              【讨论】:

              • 代码中有语法错误。 Return 应该是 return
              • 这并不总是最好的做法。值得一提的是,还有其他一些选择。
              【解决方案8】:

              在任何情况下都必须返回正确的值。因此,如果在 try/catch 块中没有返回值,请尝试使用返回值或在 try/catch 块之外维护 try catch 块。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-01
                • 2014-04-16
                • 2015-02-07
                • 2012-04-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多