Я много раз читал, что никогда нельзя слепо ловить исключения.
Некоторые люди говорят, что это нормально, чтобы заключить ваш Main () в блок catch для отображения ошибок вместо того, чтобы просто выходить ( см. Этот пост, например ), но, похоже, существует консенсус, что вы никогда не должны позволять программа работает, если произошло что-то непредвиденное, поскольку она находится в неизвестном состоянии и может действовать непредвиденным образом.
Хотя я согласен с тем фактом, что скрывать ошибки, а не исправлять их, безусловно, неверная идея, рассмотрим следующий случай:
У вас огромный сервер. Миллион строк кода.
При запуске загружает всех клиентов в свой локальный кеш.
Для меня имеет смысл написать следующее:
foreach (string CustomerID in Customers)
try
{
LoadCustomer(CustomerID);
}
catch (Exception ex) // blind catch of all exceptions
{
// log the exception, and investigate later.
}
Без слепой уловки, если не загрузить ни одного Клиента, просто произойдет сбой всего сервера.
Я определенно предпочитаю, чтобы мой сервер работал с небольшим неизвестным побочным эффектом на одного клиента, а не на весь сервер.
Конечно, если я когда-нибудь выполню свой код catch, первое, что я сделаю, это исправлю ошибку в моем коде.
Есть что-то, что я здесь пропускаю? Известны ли лучшие практики (кроме стратегии «никогда не поймать неожиданное исключение»?)
Лучше ли перехватывать исключение в методе LoadCustomer (), отбрасывать оттуда «CustomerLoadException» и перехватывать CustomerLoadException вместо всех исключений в вызывающем коде?