我决定删除我代码中的一些 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/