c# - 异常处理放置 - C#

标签 c# exception try-catch-finally

我决定删除我代码中的一些 using 语句,这样我就可以捕获特定异常 并手动处理资源处置。我重构了一些代码以使其更具可读性和可维护性,在实现新的 try/catch block 后,我想知道它们是否已针对手头的任务正确放置。

示例:

public static DataTable Select(string table, string[] column, Object operand)
{
        DataTable dTable = null;
        SQLiteConnection connection = null;
        SQLiteCommand command = null;
        SQLiteDataReader dReader = null;

        //convert to array for arguments
        StringBuilder query = new StringBuilder();
        query.Append("select ");

        for (int i = 0; i < column.Length; i++)
        {
            query.Append(column[i]);

            if (i < column.Length - 1)
            {
                query.Append(",");
            }
        }
        query.Append(" from ");
        query.Append(table);

        try
        {
            connection = new SQLiteConnection(_connectionString);
            command = new SQLiteCommand(query.ToString(), connection);
            dTable = new DataTable();

            connection.Open();

            dReader = command.ExecuteReader();

            dTable.Load(dReader);

            return dTable;
        }
        catch (SQLiteException sqle)
        {
            //Handle exception
        }
        finally
        {
            connection.Dispose();
            command.Dispose();
            dReader.Dispose();
            dTable.Dispose();
        }
        return null;
}

在这个例子中,我只围绕 SQL 操作本身实现了 try/catch,我这样做是因为它确保抛出的任何异常都可以被记录下来并正确处理资源。然后我注意到这使 for 循环对异常开放,尽管提供的索引器将受到保护并通过 GUI 创建。

将整个方法封装在 try/catch 语句中是否明智,还是我过于谨慎了?您可以说我正在寻找管理语句本身放置的最佳实践。

感谢您的宝贵时间!

编辑:

我知道 using 语句在处理资源的处置和管理方面是理想的,但是正如问题开头提到的,我希望能够捕获特定类型的异常,特别是那些从 SQLite 生成的异常组件。

最佳答案

不要忘记 null 检查:

finally {
  if (connection != null) connection.Dispose();
  if (command != null) command.Dispose();
  if (dReader != null) dReader.Dispose();
  if (dTable != null) dTable.Dispose();
}

有可能其中一个构造函数抛出异常,在这种情况下,对象将不会被初始化。

关于c# - 异常处理放置 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532253/

相关文章:

exception - 可扩展的 "SomeException"如何符合 Haskell 标准?

wcf - 请求 WCF 服务契约(Contract)时出现 HTTP Bad Request 错误

exception - Elasticsearch 5.0.0。集群节点未加入

java - 当我们可以关闭文件并且所有内容都在 catch block 中时,finally block 需要什么

javascript - 为什么 `finally` 中的返回覆盖 `try` ?

javascript - 如何在按钮单击时停止页面刷新,但我的按钮单击事件应该触发

c# - 如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程

c# - 如何使用 Unity 从 ViewModel 创建新的窗口实例?

c# - 使用 C# 远程执行 Powershell 版本 2

java - IntelliJ IDE 在将 Try-Catch 与资源一起使用时出错