c# - 你如何在 C# 中捕获 "using"的异常

标签 c# sql ado.net

给定这段代码:

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "...";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // ...
            }
        }
    }
}

我习惯于为我的数据访问编写 try/catch/finally block ,但是,我正在接触“使用”,这似乎是一种更简单的方法。但是,我正在尝试弄清楚如何捕获可能发生的异常。

能否请您举例说明如何捕获异常?

编辑添加:

我被引导相信“使用”是我的 try/catch/finally block 的替代品。我知道使用不会捕获异常。那么这是如何替代的呢?

最佳答案

using 并不是为了捕获异常而设计的;它旨在为您提供一种简单的方法来将 try/finally 包裹在需要处理的对象周围。如果您需要捕获和处理异常,那么您需要将其扩展为完整的 try/catch/finally 或放置一个包含 try/catch 整个过程。


回答你的编辑(usingtry/catch/finally 的替代品吗?)然后没有,它不是。大多数情况下,当使用一次性资源时,您不会立即处理异常,因为通常您无能为力。因此,它提供了一种方便的方法来确保资源得到清理,而不管您尝试做的事情是否有效。

通常,处理一次性资源的代码在太低的级别上工作,无法决定失败时的正确操作,因此将异常传播给调用者,调用者可以决定采取什么操作(例如重试、失败、日志等)。 您倾向于将 catch block 与一次性资源一起使用的唯一地方是您要转换异常(我假设,这是您的数据访问层正在做的事情)。

关于c# - 你如何在 C# 中捕获 "using"的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/518292/

相关文章:

c# - 如果属性值没有变化,是否可以从 IValueConverter 进行 "cancel"依赖属性赋值?

php - 当我加入另一个表时发现查询错误

c# - 如何在 Entity Framework 中编辑对象?

c# - 您如何处理 SqlConnection 中的传输级错误?

c# - 由于自动调整大小和/或嵌套的 TableLayoutPanels,TableLayoutPanel 变慢了吗?

c# - Entity Framework 延迟加载的集合有时为空

c# - 为传递给局部 View 的模型设置默认值

php - 动态下拉产生奇怪的结果

sql - max() 与 ORDER BY DESC + LIMIT 1 的性能对比

c# - 从 SQL Server 读取十进制值时出现溢出异常