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

StackOverflow https://stackoverflow.com/questions/52753

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

System.ApplicationException является классом, который не должен быть частью .NET framework.

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

Другие советы

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

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

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

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

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

Итог:не используй это.Производный от Exception.

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

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

rp

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

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 # code, которую я должен исправить.
  • "Обычная" ошибка пользователя, которая не нуждается в моем исправлении.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top