2013-06-04 79 views
2

我一直試圖添加異常處理到我的測試應用程序,但沒有成功。 我的應用程序使用SQLite作爲數據庫提供程序。C#WinForms無法捕獲SQLiteException

我特林趕上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); 
     } 

但是,如果我從工作目錄我刪除我的數據庫文件m仍然得到未處理的異常而不是MessageBox窗口。

System.Data.SQLite.SQLiteException(0X80004005):無法打開數據庫文件

我也試着捕捉異常類型和AppDomain.CurrentDomain.UnhandledException事件,但仍然得到了同樣的行爲。

我不是要求解決方案,只是想知道爲什麼它是這樣的?爲什麼我無法捕捉到異常?可能是由於GC在使用塊時遇到異常而造成的?

更新:如果我將我的sql操作代碼封裝在我的窗體方法內的try-catch塊中,異常處理就完美了。

更新:問題已通過添加ThreadExceptionEventHandler解決。任何想法如何直接捕獲SQLiteException?

此致

+0

你在哪裏「得到」這些例外?只要你調試,你的調試器就會跳轉到異常行。從調試器開始你的程序,它應該工作。 – nvoigt

+0

嗯,我知道我在哪裏以及爲什麼會得到例外。問題是:爲什麼我無法捕捉它? – fakemeta

+0

會發生什麼事情,你是否闖入調試器或執行程序,從發佈開始,只是崩潰並燒燬? – nvoigt

回答

0

SQLite的.NET庫最終管理圍繞非託管C++ SQLite的組件包裝。儘管獲取您正在使用的實際驅動程序會提供很多信息,但我認爲,當您將Sqlite添加到項目時(nuget?),它還會添加一個互操作程序集。

當您處理非託管庫的託管包裝時,有時可能遇到無法捕獲非託管代碼中引發的異常的情況。有時在您的app.config中添加傳統的未處理的異常策略,但它不適合我。

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

+0

謝謝你的回答。但是,我不認爲這是原因。當我嘗試在我的表單方法中捕獲它時發生異常。 – fakemeta