Самая распространенная вещь, которую я видел, - это то, что разработчики делают осознанный выбор в отношении того, какой уровень обрабатывать исключения и позволять их выбрасывать. Обычно это будет уровень рабочего потока или высокий уровень бизнес-логики. Позвольте исключениям случиться, и имейте общий метод обработки / регистрации их и защиты пользователя от них.
Время - единственная разница между тем, что обычно происходит, и тем, что вы делаете. Планируйте это в своих приложениях с самого начала и выполняйте обработку исключений на высоких уровнях.
Исправление определенных исключений выполняется с помощью вашего метода исправления, когда возникает проблема. Иногда библиотека, которую я использую, будет без необходимости использовать исключения для передачи информации, и я добавлю специализированную обработку исключений для всех вызовов этой библиотеки. Часто я делаю это в классе-оболочке, который скрывает реализацию и обработку исключений от остальной части моего приложения.