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);
        }

但是,如果我从工作目录中删除我的数据库文件,我仍然会收到未处理的异常而不是 MessageBox 窗口。

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 回答