Исключение .NET не обнаружено - PullRequest
6 голосов
/ 24 сентября 2011

У меня есть функция, которая выглядит следующим образом:

try
{
     _dbManager.InsertSearch(some data);
}
catch (Exception ex)
{
    //do logging
}

_dbManager использует LINQ для вставки данных в базу данных SQL.Вчера на компьютере, на котором размещена база данных, не хватило места на жестком диске, и моя программа упала.Я получил аварийный дамп, который показывает, что SqlClient.SqlException поднял с сообщением об исключении, читая что-то вроде "Журнал транзакций базы данных полон ...".

Мой вопрос: Почему исключение не было поймано в блоке catch выше?Странно то, что когда я пытался воспроизвести проблему, я мог получить то же исключение, но оно было перехвачено блоком catch.В чем может быть проблема?

Второй, связанный с этим вопрос: Представьте себе, если мы используем стороннюю библиотеку и не хотим, чтобы было выдано исключение.Мы можем использовать блок try-catch, но это работает только на вызывающем потоке.Что делать, если третья сторона запускает новый поток и там создается исключение?Есть ли способ справиться с этим?Я знаю, что могу зарегистрировать наш UnhandledExceptionHandler, но это, похоже, отличается от того, что я хотел.

Ответы [ 3 ]

6 голосов
/ 24 сентября 2011

Мой вопрос: почему исключение не было поймано в блоке catch выше?

Как предполагает Дэвид Страттон , возможно, системе не хватило места на диске, и она не смогла записать файл журнала. Существует также вероятность того, что процесс был прерван из-за исключения для поврежденного состояния , которое не будет доставлено в ваш универсальный блок в .NET 4. Исключение, что завершенный процесс, возможно, также было выброшено из потока это не было всеохватывающим.

Второй связанный вопрос: представьте, если мы используем стороннюю библиотеку и мы не хотим, чтобы любое исключение.

Я думаю, что вам придется остановиться прямо здесь и переосмыслить это. То, что вы говорите, это то, что вы абсолютно уверены на 100%, что ничто не может пойти не так, как надо, в библиотеке третьей стороны. Существуют определенные исключения (например, OutOfMemoryException), которые вы не должны отлавливать, потому что ваш код просто не знает, как восстановить их. Практическое правило обработки исключений состоит в том, что вы должны ловить только те исключения, которые вы полностью понимаете и знаете, как восстанавливаться после . Пожалуйста, посмотрите на этот ответ и ссылки в нем.

Что делать, если третье лицо запускает новый поток и выдается исключение там? Есть ли способ справиться с этим?

Лучший способ справиться с этим - использовать политику CLR по умолчанию, которая прекратит работу вашего приложения. Единственное разумное, что вы можете сделать, это попытаться войти в систему, подписавшись на AppDomain.UnhandledException .

0 голосов
/ 03 июня 2012

Если вы используете проверку выполнения контрактов Code, я советую вам проверить скомпилированную версию вашей DLL.Подробнее об этом читайте Почему исключение .net не перехватывается?

0 голосов
/ 25 сентября 2011

Возможно ли, что внутри этого InsertSearch метода есть еще один try/catch блок с условным оператором throw.

Разработчик класса 'DBManager' решил не throw, если на диске недостаточно места для записи.Просто мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...