Я считаю, что одним из лучших способов решения подобных проблем является использование аспектно-ориентированного программирования.
На самом деле, вы хотите что-то, что должно:
- Обработка исключений.
- Журнал исключений.
Существует концепция под названием «IL-ткачество», основанная на внедрении кода после компиляции, что облегчает аспектно-ориентированное программирование.
Это то, что вы можете сделать до и после выполнения методов и свойств, и, в конце концов, это «обработка любого исключения, сгенерированного в любом элементе сборки», не так ли?
Например, у меня есть некоторый опыт работы с PostSharp, который реализует IL-ткачество и позволяет невероятно легко с ним работать: он основан на атрибутах.
Вам необходимо реализовать пользовательский атрибут, порождающий некоторый базовый атрибут PostSharp, и он может переопределять некоторый метод, который будет вызываться до и после, после выполнения метода / свойства, в котором вы размещаете свой атрибут.
Обработка исключений может быть реализована как «HandleExceptionAttribute» и ведение журнала «LogAttribute» (это всего лишь пример!).
Узнайте больше о PostSharp (если я не ошибаюсь, у него есть бесплатная версия для сообщества):
И несколько практических рекомендаций: