Что лучше всего создавать при создании классов исключений в .NET-решении: вывести из System.Exception
или из System.ApplicationException
?
Должен ли я получать пользовательские исключения из Exception или ApplicationException в .NET?
Ответ 1
В соответствии с Джеффри Рихтером в книге "Руководства по дизайну рамок":
System.ApplicationException
- это класс, который не должен быть частью платформы .NET.
Предполагалось, что у вас есть смысл в том, что вы потенциально можете "исключить все" исключения приложений, но шаблон не выполнялся и поэтому он не имеет значения.
Ответ 2
Даже MSDN теперь говорит игнорировать ApplicationException:
Если вы разрабатываете приложение что необходимо создать исключений, рекомендуется получить пользовательские исключения из исключения класс. Первоначально предполагалось, что пользовательские исключения должны класс ApplicationException; однако на практике это не было нашел, чтобы добавить значительную ценность. Для дополнительную информацию см. Рекомендации по устранению исключений.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
Ответ 3
ApplicationException
считается бесполезным - сильный и критический аргумент.
Ответ 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.