Должен ли я извлекать пользовательские исключения из Exception или ApplicationException в .NET?
Вопрос
Какова наилучшая практика при создании ваших классов исключений в решении .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.