テスト アプリに例外処理を追加しようとしましたが、成功しませんでした。私のアプリはデータベース プロバイダーとして SQLite を使用します。
私はSQLiteExceptionをキャッチしようとしています:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Main());
}
catch (System.Data.SQLite.SQLiteException)
{
MessageBox.Show("Unable to perform database operation. Database file is missing or corrupt", "Database error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
私のメインフォームには、次のような行があります。
using (DbWrapper db = DbFactory.GetConnection("SQLite").WrapIn<MyDbWrapper>())
{
db.Open();
count = db.ExecuteScalar<int>("SELECT COUNT(*) FROM subject WHERE schedule_id = " + ScheduleList.SelectedValue);
}
ただし、データベース ファイルを作業ディレクトリから削除しても、メッセージ ボックス ウィンドウではなく未処理の例外が発生します。
System.Data.SQLite.SQLiteException (0x80004005): データベース ファイルを開けません
また、例外タイプと AppDomain.CurrentDomain.UnhandledException イベントをキャッチしようとしましたが、それでも同じ動作が得られました。
解決策を求めているのではなく、なぜこのように振る舞うのか疑問に思っているだけです。例外をキャッチできないのはなぜですか? ブロックの使用中に例外が発生したときに GC の破損が原因である可能性がありますか?
更新: SQL 操作コードをフォーム メソッド内の try-catch ブロックでラップすると、例外処理が完全に機能します。
更新: ThreadExceptionEventHandler を追加することで問題が解決しました。SQLiteException を直接キャッチする方法はありますか?
よろしくお願いします