Я считаю аргументы в пользу того, что общие уловы всегда плохи, потому что они слишком догматичны. У них, как и у всего остального, есть место.
Это место - , а не - код вашей библиотеки или классы, которые вы специально разрабатываете для своего приложения. Это место, как многие уже упоминали, является самым верхним уровнем приложения, где, если возникает любое исключение, оно, скорее всего, неожиданно.
Вот мое общее правило (и, как и все правила, оно разработано, чтобы его нарушать при необходимости):
Я использую классы и пользовательские библиотеки для большинства задач в приложении. Это базовая архитектура приложения - действительно базовая, заметьте. Эти парни пытаются обработать как можно больше исключений, и, если они действительно не могут продолжить, выбросить наиболее конкретный доступный вид обратно в пользовательский интерфейс.
В интерфейсе я склонен всегда отлавливать все из обработчиков событий. Если есть разумное ожидание перехвата определенного исключения, и я могу что-то с этим сделать, тогда я перехватываю конкретное исключение и обрабатываю его изящно. Однако это должно произойти до того, как перехватить все, поскольку .NET будет использовать только самый первый обработчик исключений, который соответствует вашему исключению. (Всегда заказывайте от самых специфических до самых общих!)
Если я не могу ничего сделать с исключением, кроме ошибки (скажем, база данных отключена), или если исключение действительно является неожиданным, перехват всех возьмет его, зарегистрирует его и быстро откажет с помощью общее сообщение об ошибке, отображаемое пользователю перед смертью. (Конечно, есть определенные классы ошибок, которые почти всегда безуспешно терпят неудачу - OutOfMemory, StackOverflow и т. Д. Мне повезло, что мне не приходилось иметь дело с ошибками в коде уровня продукта ... пока!)
Поймай все, имеет свое место. Это место не для того, чтобы скрыть исключение, это место не для того, чтобы пытаться восстановить (потому что, если вы не знаете, что вы поймали, как вы можете восстановить), это место не для того, чтобы не показывать пользователю ошибки при разрешении Ваше приложение продолжает работать в неизвестном и плохом состоянии.
Поймать все - значит быть последним средством, ловушкой, которая гарантирует, что, если что-то пройдет через вашу хорошо спроектированную и хорошо охраняемую оборону, то, как минимум, она будет зарегистрирована надлежащим образом и может быть сделан чистый выход. Это - это плохая практика, если у вас нет хорошо спроектированной и хорошо охраняемой защиты на нижних уровнях, и это очень плохая практика на более низких уровнях, но сделанная как в крайнем случае это (на мой взгляд) не только приемлемо, но часто и правильно.