2013-06-28 2 views
0

При запросе из базы данных с использованием Entity Framework какие исключения следует улавливать и что делать с ними?Обработка особых исключений из структуры сущностей - стандарты/рекомендации?

Обычно я использую catch(Exception), потому что у меня нет конкретных действий или отзывов для всех возможных типов ошибок, но мне постоянно напоминают, что это страшная идея и что определенные исключения следует поймать и обработать! Пример:

try 
{ 
    using(MyEntities context = new MyEntities()) 
    { 
     context.Companies.Attach(company); 
     ActiveEmployees = company.Employees.Where(x => x.IsActive).ToList(); 
    } 
} 
catch(Exception ex) 
{ 
    Feedback(FeedbackType.ApplicationError); // User feedback 
    Logger.Log(ex); // Log the exception 
} 

Каковы стандарты/рекомендации по обработке исключений EF?

ответ

1

Многие исключения не должны быть пойманы, но предотвращены. Я имею в виду такие исключения, как нарушение ограничений FK или других ограничений базы данных, присоединение объектов, которые уже подключены, ленивая загрузка при размещении контекста, неподдерживаемые операторы LINQ и т. Д. должен пузыриться в модульных тестах/тестах интеграции. Вот почему я бы не использовал такой общий try-catch, который глубоко в вашем коде (это похоже на какой-то репозиторий или метод службы), но выше, например. в модели пользовательского интерфейса или представления. Они должны сделать ваши тесты аварийными.

Есть одно исключение, о котором я могу думать, что вы можете захотеть поймать и обработать близко к коду доступа к данным, и это исключение оптимизма. Это связано с тем, что конфликты параллелизма не могут быть полностью предотвращены в коде (время всегда оставляет пробелы), и вам приходится полагаться на базу данных, чтобы генерировать исключения, когда они происходят. См. here для некоторых моделей, как бороться с оптимистичным параллелизмом.

1

Есть исключения, которые могут быть брошены этими несколькими утверждениями. Возможно, у вас нет сетевого подключения к базе данных. Компания, которую вы прикрепляете, может быть прикреплена к другому контексту. Сотрудники могут быть не виртуальными или не загруженными в первую очередь и, следовательно, нулевыми. Вам нужно будет проверить документацию для каждого метода и выяснить, что вам нужно поймать.

Но мои два цента - это то, что вы уже поймали их всех, и вы делаете единственное, что можете. Вы регистрируете их и спрашиваете у пользователя, что он/она сделал. (И, возможно, отправите себе электронное письмо?)

После этого вы получите журнал, показывающий, какие исключения действительно происходят, и вы можете решить, что с ними делать. Но в основном пользователь заинтересован только в том, что сайт «вниз» и будет восстановлен в n.