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 2

1 ответ:

Недавно я исследовал ту же проблему в нашем коде C#/C++. В итоге я загрузил систему.Данные.Исходный код SQLite и отладка библиотеки. Система.Данные.Библиотека DLL SQLite - это оболочка C# вокруг стандартной библиотеки SQLite (C++).

Самое важное: система.Данные.Библиотека DLL SQLite использует исключения, однако SQLite использует коды возврата. Оболочка перехватывает коды возврата из SQLite и преобразует их в исключения, если это целесообразно.

Если код SQLite (SQLite.Взаимодействия) был скомпилированная с флагом INTEROP_LOG, библиотека регистрирует только определенные ошибки в стандартном выводе и не делает этого (возможно, по ошибке??) уведомите обертку об ошибке такого рода. Поэтому wrapper не знает о проблеме и не будет выдавать исключение.

Подробнее:

Если вы хотите загрузить и скомпилировать систему.Данные.Библиотека SQLite самостоятельно попробуйте установить точку останова в файле SQLite.Взаимодействие\взаимодействие.c в функции sqlite3InteropLogCallback. Ваша программа остановится всякий раз, когда обнаружена ошибка "база данных заблокирована", однако исключение не будет выброшено.