Должен ли я получать пользовательские исключения из Exception или ApplicationException в .NET?

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

Ответ 1

В соответствии с Джеффри Рихтером в книге "Руководства по дизайну рамок":

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

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

Ответ 2

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

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

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

Ответ 4

Авторы самой структуры считают 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

Далее обсуждается тема сообщения в блоге.

гр

Ответ 5

Я привык:

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.");
    }
}

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

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

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