尝试/捕获并返回值

本文关键字:返回值 尝试 | 更新日期: 2023-09-27 18:31:58

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

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

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

这是方法:

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;
}

尝试/捕获并返回值

删除完整的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 实现时,您希望对无法获取产品详细信息做出不同的反应。您将不得不想出解决方法。您甚至可能最终会遇到难以排除故障的奇怪错误。

这取决于在特殊情况下应该发生什么。如果这可能是由于某种原因而发生的,而这种原因还不够"糟糕",无法让应用程序崩溃,或者如果您能够适当地处理该异常,那么您可以使用当前的appraoch - 但是您应该明确地在包含已抛出错误的catch子句中至少留下一条日志消息:

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

这样,您可以获得列表中的所有结果,但导致任何异常的结果除外。您可以简单地继续处理您获得的所有结果并忽略那些错误(假设您以任何方式记录了它们)。

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

目前,如果引发异常,则不会返回任何内容。使用 try, catch, finally .(可能您想查看MSDN页面以获取更多官方信息)

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

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