不抛出C#SQLiteException(并且只有SQLiteException)

时间:2016-02-25 20:25:47

标签: c# visual-studio system.data.sqlite

我有一段代码:

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正确地执行此操作,并且除了此程序之外的其他所有异常都没有问题。

我知道为什么会发生错误。这对我来说完全没有意义,也是无关紧要的。

我想知道的是为什么这个问题似乎没有实际产生异常,或者没有抓住它。我完全知道错误正在发生。您可以在“诊断工具”窗口的“事件”选项卡中看到它们。他们堆积在那里,但在任何时候我都没有获得可捕获的异常,只是在事件选项卡中无用的垃圾。

我该如何处理?如果错误(SQLite错误(5):数据库被锁定)是一个问题,那么为什么我没有得到异常?如果它不是问题并且最终会被处理,为什么它会污染我的事件列表?

它目前的方式完全不可接受,因为它完全没有意义。这是一个问题,在这种情况下,我应该得到一个异常,或者这不是一个问题,在这种情况下,我不想被无用的调试事件所淹没。

1 个答案:

答案 0 :(得分:2)

我最近在C#/ C ++代码中研究了同样的问题。我最终下载了System.Data.SQLite源代码并调试了库。 System.Data.SQLite DLL是标准SQLite(C ++)库的C#包装器。

最重要的是:System.Data.SQLite DLL使用异常,但SQLite使用返回代码。包装器拦截来自SQLite的返回代码,并在合理的情况下将它们转换为异常。

如果SQLite代码(SQLite.Interop)是使用INTEROP_LOG标志编译的,那么库只会将某些错误记录到标准输出中,而不会(可能是错误的)将这种错误通知给包装器。因此包装器不知道问题,也不会抛出异常。

更深入:

如果您想自行下载并编译System.Data.SQLite库,请尝试在函数sqlite3InteropLogCallback中的文件SQLite.Interop \ interop.c中设置断点。只要遇到“数据库被锁定”错误,您的程序就会停止,但不会抛出任何异常。