Исключения фреймворка сущностей

Меня эта мысль давно посещает, и я до сих пор не могу найти ответа. Мой DbContext обрабатывается классом UnitOfWork. Итак, у меня есть одно место, где происходят изменения сохранения, и я перехватываю все эти неприятные исключения и обрабатываю их в одном месте.

Но, как известно, DbContext иногда может генерировать другие типы исключений в других местах, помимо метода SaveChanges(). Например, при материализации сущностей. Но это может произойти во многих местах, и иногда написание блоков try catch для каждого вызова FirstOrDefault() или ToList(), а также перехват и повторная выдача исключений являются накладными расходами. Иногда это исключения могут быть типа SQL, что означает, что соединение не может быть открыто, EntityCommandExecutionException или другие.

Поэтому мне было интересно, есть ли какое-либо событие, которое объект DbContext срабатывает при возникновении исключения, поэтому я могу подписаться на это событие и обработать некоторую логику в этих сценариях. :)


person mravko    schedule 05.04.2013    source источник


Ответы (1)


Нет, нет. И никогда не будет по (как минимум) трем причинам:

  1. Исключения могут создаваться намеренно, но они также могут возникать где-то в исходном коде EF и всплывать наружу. В первом случае они могли инициировать событие, во втором — нет. Так что вы никогда не будете в безопасности.

  2. Как должно запускаться событие? Есть несколько способов запустить событие. Один из них - это просто re-throw в блоке catch. Запуск event в блоке catch звучит как очень плохая практика. Блоки перехвата должны содержать безопасный и стабильный код. Если в блоке catch возникает исключение, все становится еще хуже. У меня было бы очень плохое предчувствие, если бы кто-то мог подключить какой-либо код в моих блоках catch.

  3. Когда должно быть запущено событие? Некоторые исключения могут создаваться и обрабатываться в сборке EF. Вероятно, вы никогда даже не захотите узнать, что они произошли. Но в другом сценарии то же самое исключение может всплыть.

person Gert Arnold    schedule 05.04.2013
comment
Прежде всего, спасибо за ваш ответ. В этом случае не могли бы вы предоставить несколько ссылок или ключевых слов о том, как обрабатывать исключения, такие как тайм-аут, невозможность открытия соединения (другие, кроме DbUpdate и Concurrency) более централизованным способом. - person mravko; 08.04.2013
comment
Есть некоторые идеи здесь, но нижняя часть строка: вы должны обрабатывать их там, где вы не хотите, чтобы они всплывали, поэтому у вас всегда будет try-catch блоков. - person Gert Arnold; 08.04.2013