当前位置: 首页 > 知识库问答 >
问题:

尝试/捕获和返回值

暴乐邦
2023-03-14

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

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

如果我放置在catch之后(就像我目前所做的那样),即使在异常之后,它也会返回产品。那么最好的方法应该是什么?

方法如下:

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个答案

丌官飞章
2023-03-14

目前,如果抛出异常,则不会返回任何内容。使用<code>try、catch和finally<code>。(您可能想查看MSDN页面以了解更多官方信息。)

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

因此,如果将<code>return

杭柏
2023-03-14

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

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

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

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

闻鹤龄
2023-03-14

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

 类似资料:
  • 我已经写了一个节点。使用express框架的jsapi。我正在使用wait和async。我在try-catch块中捕获异步函数。但是,在catch(err)方法中,不会返回err。 在上面的例子中,我故意调用一个不存在的函数,这样它就会抛出一个错误。 我得到的答复如下。它正在命中catch块,但没有将错误添加到数据对象中。 但是,如果我将下面的行移出try catch块。控制台将抛出以下错误。 所

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 我想要能够让我的catch请求用户输入文件名,直到文件名有效为止,有没有人能给我一个建议,如何安排我的代码做到这一点? 导入java.io.FileNotFoundException;导入java.util.scanner; public class Requierment2{public static void main(String[]args){ }

  • 问题内容: 以下代码给出了编译错误,提示“意外运行”: 我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等 我的问题是为什么不能从goroutine中获取像这样的返回值。 问题答案: 严格的答案是您 可以 做到。这可能不是一个好主意。下面的代码可以做到这一点: 这将产生一个新的goroutine,它将进行计算,然后将结果分配给。问题是:您将如何使用原始go

  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall