コード内の一部の using ステートメントを削除して、特定の例外をキャッチし、リソースの破棄を手動で処理できるようにすることにしました。新しい try/catch ブロックを実装した後、手元のタスクに対して正しく配置されているかどうか疑問に思っています。
例:
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 のみを実装しました。スローされた例外を確実に認識し、リソースが正しく破棄されるようにするためです。その後、提供されたインデクサーは保護され、GUI を介して作成されますが、これにより for ループが例外に対して開かれたままになっていることに気付きました。
メソッド全体を try/catch ステートメントにカプセル化するのが賢明でしょうか、それとも過度に用心深いのでしょうか? ステートメント自体の配置を管理する際のベスト プラクティスを探していると言えます。
御時間ありがとうございます!
編集:
using ステートメントは、リソースの破棄と管理を処理するという点で理想的であることはわかっていますが、質問の冒頭で述べたように、特定の種類の例外、特に SQLite コンポーネントから生成された例外をキャッチできるようにしたいと考えています。