Что ж, общая идея состоит в том, чтобы пользовательский интерфейс не обрабатывал все исключения, и в этом нет особого смысла.Допустим, у вас есть слой данных, реализованный с помощью ADO.NET.Общий шаблон здесь заключается в обработке SqlException на уровне данных, а затем оборачивании SqlException в более значимое DatabaseLayerException, которое должны обрабатывать верхние уровни - и вы следуете этому шаблону вплоть до самого верха, чтобы вы могли иметь что-то вроде InfrastructureException, ApplicationException и т. Д...
В самом верху вы перехватываете все исключения ApplicationException, которые остались необработанными (и заставляете все ваши исключения наследовать это исключение для полиморфизма), и вы перехватываете все необработанные исключения как особый случай, который вряд ли произойдет,и попробуйте восстановить его.
Я также предлагаю использовать ведение журнала вручную или с помощью AOP - вы найдете много ресурсов в Интернете (возможно, Log4Net?).