try / catch和返回值

时间:2016-01-26 10:09:55

标签: c# methods exception-handling return try-catch

我有一个返回List的方法。现在我想知道如何正确放置try/catch块。如果我将return语句放在try中,我会收到错误

  

并非所有代码路径都返回值

如果我放在catch之后(就像我现在正在做的那样),即使在products之后,它也会返回Exception。那么什么应该是最好的方式呢?

以下是方法:

public List<Product> GetProductDetails(int productKey)
{
    List<Product> products = new List<Product>();
    try
    {
       using (SqlConnection con = new SqlConnection(_connectionString))
       {
         SqlCommand cmd = new SqlCommand("usp_Get_ProductDescription", con);
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@riProductID", productKey);
         con.Open();
         using (SqlDataReader reader = cmd.ExecuteReader())
         {
           while (reader.Read())
           {
             Product product = new Product(reader["Name"].ToString(), reader["Code"].ToString());
             products.Add(product);
           }
         }
       }
     }
     catch { }
     return products;
}

3 个答案:

答案 0 :(得分:4)

删除完整的TryCatch块。显然你无法处理GetProductDetails方法中的异常,所以只是让它们被抛出。

然而,调用代码可以做出决定:

IList<Product> products = null;

try
{
    products = GetProductDetails(3);
}
catch(Exception ex)
{
    // Here you can make the decision whether you accept an empty list in case of retrieval errors.
    // It is the concern of this method, not of the ProductDetails method.
    // TODO: Use logging
    products = new List<Product>();
}

我可以想象如果你必须使用GetProductDetails方法在每个方法中编写它,感觉就像代码重复一样。但是,考虑到,当您实施X时,您希望以不同的方式做出反应,以便无法获得产品详细信息。您将不得不提出变通方法。您甚至可能会遇到难以排除故障的奇怪错误。

答案 1 :(得分:1)

这取决于特殊情况下应该发生的事情。如果由于某些原因而发生这种情况可能会导致应用程序崩溃或者您能够正确处理该异常,那么您可能会使用当前的appraoch - 但是您应该至少留下一条日志消息在catch-clause中包含抛出的错误:

catch (Exception e) 
{ 
    log.Info(e.Message);
}

通过这种方式,您可以获得列表中的所有结果,除了导致任何异常的结果。您可以继续使用所有结果并忽略那些错误(假设您以任何方式记录它们)。

如果它是一个非常意外的行为(这是异常的预期行为,这就是它们被称为异常的原因)你应该从你的方法中删除所有这个try / catch并处理方法之外的任何异常,如Maurice已经提到的。

答案 2 :(得分:0)

目前,如果抛出异常,您不会返回任何内容。 使用try, catch, finally。 (您是否希望查看MSDN page以获取更多官方信息)

try
{
    //try to execute this code
}
catch
{
    //execute this if an exception is thrown
}
finally
{
    //execute this code, after try/catch
}

因此,如果您将return语句放入finally部分,即使发生异常,您也会返回列表...