尝试/捕获并返回值
本文关键字:返回值 尝试 | 更新日期: 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;
}
删除完整的Try
和Catch
块。显然,您无法处理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
部分,即使抛出异常,您也会返回您的列表......