2016-02-25 28 views
1

我的代碼段:C#SQLiteException(只有SQLiteException)不被拋出

try 
{ 
    //sniping out a bunch of irrelevant code here 
    result = cmd.ExecuteScalar(); 
    onExecution?.Invoke(result); 
    return true; 
} 
catch (SQLiteException e) 
{ 
    if (e.ResultCode == SQLiteErrorCode.Corrupt) 
    { 
     CorruptionDetected?.Invoke(null, EventArgs.Empty); 
    } 
    //snip - else if {etc} 
    throw; 
} 

的問題:我有VS設置爲無論什麼方面始終所有的時間都異常打破無一例外。 VS正確執行此操作,並且程序中的其他任何異常都不會出現問題,除此之外。

我知道爲什麼會發生錯誤。這對我來說絕對不感興趣,也是毫不相關的。

我想知道的是爲什麼這個問題似乎沒有實際產生異常,或者沒有捕捉到它。我100%肯定地知道錯誤正在發生。您可以在「診斷工具」窗口的「事件」選項卡中看到它們。他們堆積在那裏,但我從來沒有得到一個可捕獲的異常,只是在事件選項卡中無用的垃圾。

我該如何處理?如果錯誤(SQLite錯誤(5):數據庫被鎖定)是一個問題,那麼爲什麼我沒有得到異常?如果這不是問題並且最終得到處理,爲什麼會污染我的活動列表?

它目前的立場是完全不可接受的,因爲它絕對沒有意義。要麼這是一個問題,在這種情況下,我應該得到一個異常,或者這不是一個問題,在這種情況下,我不想被無用的調試事件淹沒。

回答

1

我最近在C#/ C++代碼中調查了同樣的問題。我最終下載了System.Data.SQLite源代碼並調試了庫。 System.Data.SQLite DLL是圍繞標準SQLite(C++)庫的C#封裝。

最重要的是:System.Data.SQLite DLL使用異常,但SQLite使用返回碼。如果合理的話,包裝程序攔截來自SQLite的返回代碼並將它們轉換爲異常。

如果使用INTEROP_LOG標誌編譯SQLite代碼(SQLite.Interop),則該庫僅將某些錯誤記錄到標準輸出,並且不會(可能錯誤地)通知包裝器這種錯誤。因此包裝器不知道問題並且不會拋出異常。

更深入:

如果mangage下載和編譯你自己的System.Data.SQLite庫,嘗試設置文件SQLite.Interop \ interop.c一個突破點在功能sqlite3InteropLogCallback。遇到'數據庫被鎖定'錯誤時,程序將停止,但不會拋出異常。