【问题标题】:C# WinForms Unable to catch SQLiteExceptionC# WinForms 无法捕获 SQLiteException
【发布时间】:2013-05-30 20:54:34
【问题描述】:

我一直在尝试向我的测试应用程序添加异常处理,但没有成功。 我的应用程序使用 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): 无法打开数据库文件

我也尝试过捕获 Exception 类型和 AppDomain.CurrentDomain.UnhandledException 事件,但仍然有相同的行为。

我不是在寻求解决方案,只是想知道为什么会这样?为什么我无法捕捉到异常?可能是因为使用block遇到异常时GC损坏造成的?

更新:如果我将我的 sql 操作代码包装在我的表单方法中的 try-catch 块中,则异常处理非常有效。

更新:通过添加 ThreadExceptionEventHandler 解决了问题。任何想法如何直接捕获 SQLiteException?

最好的问候

【问题讨论】:

  • 你从哪里“得到”这些异常?只要你调试,你的调试器就会跳转到异常所在的行。从调试器中启动您的程序,它应该可以工作。
  • 好吧,我确实知道我在哪里以及为什么会遇到异常。问题是:为什么我无法抓住它?
  • 会发生什么,您是闯入调试器还是您的程序在发布时启动,然后崩溃并烧毁?
  • 应用程序因未处理的异常错误而崩溃。

标签: c# winforms sqlite exception exception-handling


【解决方案1】:

Sqlite .NET 库最终是围绕非托管 c++ Sqlite 程序集的托管包装器。尽管获取您正在使用的实际驱动程序会提供信息,但我假设当您将 Sqlite 添加到您的项目(nuget?)时,它还添加了一个互操作程序集。

当您处理围绕非托管库的托管包装器时,您有时会遇到无法捕获非托管代码中引发的异常的情况。有时在你的 app.config 中添加遗留的未处理异常策略是可行的,但它不适合我。

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

【讨论】:

  • 感谢您的回答。然而,我不认为这是原因。当我在我的表单方法中尝试捕获它时捕获了异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2011-01-28
  • 2020-09-06
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多