Що є найкращою практикою при створенні класів винятків у .NET-рішенні: похідне від System.Exceptionабо з System.ApplicationException?
Відповіді:
Відповідно до Джеффрі Ріхтера в книзі Framework Guidelines:
System.ApplicationExceptionце клас, який не повинен бути частиною .NET framework.
Він мав мати якесь значення в тому, що ви могли б потенційно вловити "всі" винятки додатків, але шаблон не був дотриманий, тому він не має значення.
Exception? Якщо так, чи можете ви так сказати?
Ви повинні отримувати власні винятки з System.Exception.
Навіть MSDN зараз каже ігнорувати ApplicationException:
Якщо ви розробляєте програму, яка повинна створити власні винятки, вам рекомендується отримати спеціальні винятки з класу винятків. Спочатку вважалося, що власні винятки повинні походити з класу ApplicationException; однак на практиці не встановлено, що це додає значної вартості. Для отримання додаткової інформації див. Найкращі практики щодо обробки винятків .
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationExceptionвважається марним - це вагомий і критичний аргумент проти ApplicationException.
Підсумок: не використовуйте його. Вивести з Exception.
Самі автори фреймворку вважають ApplicationException марним:
з приємним продовженням тут:
Якщо виникають сумніви, я дотримуюся їхньої книги “Framework Design Guidelines”.
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.");
}
}
Це дозволяє зробити різницю між:
Я знаю, що не рекомендується використовувати ApplicationException, але це чудово працює, оскільки є дуже мало класів , які не поважають шаблон ApplicationException.