2012-03-02 2 views
5

Это мое первое приложение, которое будет правильно обрабатывать исключения. Это служба WCF. Все остальные раньше были простыми приложениями только для меня. У меня очень мало знаний об обработке исключений на C#.Как поймать исключения

У меня есть такой код:

MembershipUser memUser = Membership.GetUser(username); 

DatabaseDataContext context = new DatabaseDataContext(); 
UserMembership user = UserMembership.getUserMembership(memUser); 
ItemsForUser itemUser = Helper.createItemForUser(ref item, memUser); 
Helper.setItemCreationInfo(ref item, user); 
context.Items.InsertOnSubmit(item); 
context.SubmitChanges(); 

В этом коде несколько исключений может случиться. Например, например NullReferenceException. Как узнать, какой объект вызвал исключение, чтобы я мог знать, что делать в catch и что возвращать клиенту?

+0

Вы можете найти ответ и ссылки в нем: http://stackoverflow.com/a/7152374/625332 – Dmitry

ответ

9

В общем, вы не должны улавливать любые исключений.

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

«Исключения» этого правила имеют отношение к тому, что означает «обрабатывать» исключение. В некоторых приложениях «обработка» исключения означает его регистрацию. В других (например, ASP.NET) лучше не обрабатывать исключение, потому что в этом случае система (мониторинг работоспособности ASP.NET в этом случае) будет регистрировать ее для вас.

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

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

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    throw new TierException("Some message", ex); 
} 

Другого случай использования поймать исключение, а затем бросить новое исключение с дополнительной информацией в нем:

public int GetValueFromConfigurationFile(...) 
{ 
    const string configFileName = "..."; 
    try 
    { 
     // ... 
    } 
    catch (FileNotFoundException fEx) 
    { 
     throw new InvalidOperationException(
      String.Format("Can't find configuration file {0}", configFileName), 
      fEx); 
    } 
} 

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

Общее сообщение: - только перехватывать исключения вы знаете, как обращаться с - Поймать наиболее конкретное исключение из возможных - Всегда включать внутреннее исключение при создании нового исключения, чтобы сохранить цепочку исключений - Для того, чтобы повторно выдать текущее исключение, используйте throw;, а не throw ex;

Есть еще несколько, и я попытаюсь найти вам ссылку из Руководства по разработке Microsoft Framework.

P.S. Если кто-то может найти вопрос, это дубликат, не стесняйтесь закрывать его как дубликат. Я не против потерять репутацию от этого. Я просто не мог найти дубликат.


Я должен был просто разместил ссылку на «обработка исключений» tag wiki, где он говорит:

Однако, для обработки исключений в контексте .NET программ, см "Design Guidelines for Exceptions ».

+0

Этот ответ наводит мои носки. – CptSupermrkt

+0

Спасибо, но на самом деле это не _my_ ответ. Мне просто нужно найти ссылки. –

1

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

Смежные вопросы