我有一段代码:
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):数据库已锁定)是一个问题,那么为什么我没有收到异常?如果这不是问题,并且最终得到处理,为什么它会污染我的事件列表?
它目前的状态是完全不可接受的,因为它完全没有道理。在这种情况下,我应该得到一个异常是一个问题,或者在这种情况下,我不想被无用的调试事件所淹没,这不是一个问题。
我最近在我们的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中设置断点。每当遇到“数据库锁定”错误时,您的程序都会停止,但是不会引发异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句