2

テスト アプリに例外処理を追加しようとしましたが、成功しませんでした。私のアプリはデータベース プロバイダーとして 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 を直接キャッチする方法はありますか?

よろしくお願いします

4

1 に答える 1

0

Sqlite .NET ライブラリは、最終的にはアンマネージ c++ Sqlite アセンブリのマネージ ラッパーです。使用している実際のドライバーを入手することは参考になりますが、Sqlite をプロジェクト (nuget?) に追加したときに相互運用アセンブリも追加されたと思います。

アンマネージ ライブラリのマネージ ラッパーを扱っている場合、アンマネージ コードでスローされる例外をキャッチできない場合があります。app.config に従来の未処理の例外ポリシーを追加するとうまくいくことがありますが、私にはうまくいきませんでした。

http://msdn.microsoft.com/en-us/library/ms228965(v=vs.100).aspx

于 2013-06-04T13:12:03.603 に答える