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 error (5): database is locked) является проблемой, то почему я не получаю исключение? Если это не проблема, и она в конечном счете обрабатывается, почему она загрязняет мои события список?
То, как это сейчас происходит, просто совершенно неприемлемо, поскольку это абсолютно бессмысленно. Либо это проблема, и в этом случае я должен получить исключение, либо это не проблема, и в этом случае я не хочу быть заваленным бесполезными отладочными событиями.1 ответ:
Недавно я исследовал ту же проблему в нашем коде C#/C++. В итоге я загрузил систему.Данные.Исходный код SQLite и отладка библиотеки. Система.Данные.Библиотека DLL SQLite - это оболочка C# вокруг стандартной библиотеки SQLite (C++).
Самое важное: система.Данные.Библиотека DLL SQLite использует исключения, однако SQLite использует коды возврата. Оболочка перехватывает коды возврата из SQLite и преобразует их в исключения, если это целесообразно.
Если код SQLite (SQLite.Взаимодействия) был скомпилированная с флагом INTEROP_LOG, библиотека регистрирует только определенные ошибки в стандартном выводе и не делает этого (возможно, по ошибке??) уведомите обертку об ошибке такого рода. Поэтому wrapper не знает о проблеме и не будет выдавать исключение.
Подробнее:
Если вы хотите загрузить и скомпилировать систему.Данные.Библиотека SQLite самостоятельно попробуйте установить точку останова в файле SQLite.Взаимодействие\взаимодействие.c в функции sqlite3InteropLogCallback. Ваша программа остановится всякий раз, когда обнаружена ошибка "база данных заблокирована", однако исключение не будет выброшено.