Должен ли я получить пользовательские исключения из Exception или ApplicationException в .NET? - PullRequest
73 голосов
/ 09 сентября 2008

Что рекомендуется при создании классов исключений в решении .NET: Производные от System.Exception или System.ApplicationException?

Ответы [ 5 ]

60 голосов
/ 10 сентября 2008

Согласно Джеффри Рихтеру из книги «Руководство по проектированию рамок»:

System.ApplicationException - это класс, который не должен быть частью .NET Framework.

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

25 голосов
/ 06 июля 2009

Вы должны получить пользовательские исключения из System.Exception.

Даже MSDN теперь говорит игнорировать ApplicationException:

Если вы разрабатываете приложение который должен создать свой собственный исключения, вам рекомендуется вывести пользовательские исключения из исключения учебный класс. Первоначально считалось, что пользовательские исключения должны происходить из класс ApplicationException; Однако на практике это не было найдено, чтобы добавить значительную ценность. За дополнительную информацию см. в Рекомендации по обработке исключений .

http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

18 голосов
/ 09 сентября 2008

ApplicationException считается бесполезным - сильный и критический аргумент против ApplicationException.

Апшот: не используйте его. Производная от Exception.

13 голосов
/ 09 сентября 2008

Авторы фреймворка сами считают ApplicationException бесполезным:

http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

с хорошим продолжением здесь:

http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

Если сомневаюсь, я следую их руководству по разработке рамок.

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

Тема поста в блоге обсуждается там далее.

гр

1 голос
/ 06 июля 2009

Я привык делать:

private void buttonFoo_Click()
{
    try
    {
       foo();
    } 
    catch(ApplicationException ex)
    {
      Log.UserWarning(ex);
      MessageVox.Show(ex.Message);
    }
    catch(Exception ex)
    {
       Log.CodeError(ex);
       MessageBox.Show("Internal error.");
    }
}

Это позволяет сделать разницу между:

  • Ошибка кода системы C #, которую я должен исправить.
  • "Нормальная" ошибка пользователя, которая не требует от меня исправления.

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

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