Обработка исключений в C # с Entity Framwork 4 - PullRequest
3 голосов
/ 11 марта 2011

Я использую asp.net 4, c # и ef4.

Я хотел бы знать, как лучше всего поймать универсальное исключение из Entity Framework.

  • На данный момент я использую Exception это уместно?
  • Как поймать более конкретную?

Спасибо за ваше время.

try
{
    context.DeleteObject(myLockedContent);
    context.SaveChanges();
}
catch (Exception)
{
    e.Cancel = true;
}

Ответы [ 3 ]

7 голосов
/ 11 марта 2011

Редко хорошо ловить общие исключения и просто отменять их. Существуют исключения, помогающие убедиться, что код работает правильно.

Вы можете перехватывать определенные типы исключений так же, как и для универсального (хотя и с идентификатором, который вы пропустили в вашем примере), таким образом:

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the exception
}

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

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the specific exception
}
...
catch (Exception ex) 
{
    // Do some real work to resolve the generic 'catch-all' exception
}
5 голосов
/ 11 марта 2011

Не делайте этого.

Вы скрываете ошибки, которые могут серьезно повлиять на надежность вашего приложения. Исключение выдается по причине , просто продолжать, как будто ничего не произошло, просто неправильно.

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

Вы должны использовать catch all

a), когда хотите обернуть исключения на границах слоя (но включите оригинальное исключение).

b) когда исключение распространилось на верхний уровень (что приведет к прекращению вашего приложения, если исключение не будет перехвачено).

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

2 голосов
/ 11 марта 2011

способ, которым вы ловите в своем примере, плох, всегда регистрируйте исключение где-нибудь и каким-либо образом, например, в текстовом файле или в SMTPAppender, вы можете использовать Log4Net и запустить его в очень короткое время с минимальным кодированием от вашегоside.

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

просто имейте в виду, что вы должны поместить все ваши предложения catch от более специфичных к более общим, в вашем примере, если у вас есть несколько уловов, тот, который вынаписано надо ставить в конце.

...