【问题标题】:Getting compilation error with method: "not all code paths return a value"使用方法获取编译错误:“并非所有代码路径都返回值”
【发布时间】:2013-09-07 04:48:44
【问题描述】:

我无法弄清楚为什么我不断收到编译错误:“并非所有代码路径都返回值”。我正在编写一个简单的类方法,如果帐户可用,则返回 true;如果帐户不可用或为空/空,则返回 false。该方法的代码如下:

public static bool AccountAvailable(int AccountId)
{
    try
    {            
        bool accountavailable;

        string queryTransaction = "Select Count(AccountID) FROM Accounts WHERE AccountID = " + AccountId.ToString() + " AND AccountUsed = 0";

        //grab a connection to the database
        Database database = DatabaseFactory.CreateDatabase();

        //create an instance of the command
        DbCommand command = database.GetSqlStringCommand(queryTransaction);

        object dataobject = command.ExecuteScalar();

        if (dataobject == null || string.IsNullOrEmpty(Convert.ToString(dataobject)))
        {
            accountavailable = false;
        }

        else if (Convert.ToInt32(dataobject) == 0)
        {
            accountavailable = false;
        }

        else if (Convert.ToInt32(dataobject) > 0)
        {
            accountavailable = true;
        }

        else
        {
            accountavailable = true;
        }

        return accountavailable;
    }

    catch
    {

    }
}

对此的任何帮助或建议将不胜感激。谢谢!!

【问题讨论】:

  • 解释当try 块内抛出异常时您认为会发生什么。还要解释为什么你首先有一个 try 块。像你在这里所做的那样构建一个 try-catch 是一种“最糟糕的做法”,所以如果你解释你这样做的原因,我们可以让你摆脱任何导致你编写这个糟糕代码的错误想法。跨度>
  • 您不应该捕获所有异常然后什么都不做。如果你有问题,你永远不会发现哪里出了问题。如果您遇到无法在代码中处理的问题,那么您需要了解它,这意味着至少 非常,您应该记录问题,而且很有可能没有你应该让异常冒泡,因为你不能有意义所以如果你遇到意外的异常会问你什么。
  • 哦,你不应该通过连接字符串来生成查询,这会让你对 SQL 注入开放。
  • @Servy:很好的建议,但要迂腐,在这种情况下很难用 int 注入任何有用的东西。
  • @spender 没错,我在评论后注意到了这一点,但认为它仍然值得离开。

标签: c# asp.net methods compiler-errors boolean


【解决方案1】:

如果在您返回值之前在您的代码中引发异常,则控制将移至catch 块。然后它到达方法的末尾而不返回任何内容。

在 catch 块内或之后返回一些东西。

【讨论】:

    【解决方案2】:

    在你的 catch 块中,添加一个 return:

    catch (Exception ex)
    {
        // your code
        return null;
    }
    

    【讨论】:

      【解决方案3】:

      建议尝试此代码

      public static bool AccountAvailable(int AccountId)
      {
          bool accountavailable = false;
          try
          {            
      
              string queryTransaction = "Select Count(AccountID) FROM Accounts WHERE AccountID = " + AccountId.ToString() + " AND AccountUsed = 0";
      
              //grab a connection to the database
              Database database = DatabaseFactory.CreateDatabase();
      
              //create an instance of the command
              DbCommand command = database.GetSqlStringCommand(queryTransaction);
      
              object dataobject = command.ExecuteScalar();
      
              if (dataobject == null || string.IsNullOrEmpty(Convert.ToString(dataobject)))
              {
                  accountavailable = false;
              }
      
              else if (Convert.ToInt32(dataobject) == 0)
              {
                  accountavailable = false;
              }
      
              else if (Convert.ToInt32(dataobject) > 0)
              {
                  accountavailable = true;
              }
      
              else
              {
                  accountavailable = true;
              }
      
          }
      
          catch
          {
      
          }
          return accountavailable;
      }
      

      【讨论】:

      • 我更正编译错误并回答问题。我不判断编码的质量
      • 实际上,再看一遍,这甚至无法编译。 accountavailable最后使用的时候没有明确赋值,是编译器错误。
      • 我明白,我是法国人,我的英语并不完美,我在帖子中将“正确”替换为“建议”
      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 2020-05-22
      • 2013-07-01
      • 2014-04-16
      • 2015-02-07
      • 2012-04-16
      相关资源
      最近更新 更多