我有一段代码:
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):数据库被锁定)是一个问题,那么为什么我没有得到异常?如果它不是问题并且最终会被处理,为什么它会污染我的事件列表?
它目前的方式完全不可接受,因为它完全没有意义。这是一个问题,在这种情况下,我应该得到一个异常,或者这不是一个问题,在这种情况下,我不想被无用的调试事件所淹没。
答案 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中设置断点。只要遇到“数据库被锁定”错误,您的程序就会停止,但不会抛出任何异常。