Как обеспечить выполнение ожидаемого действия всякий раз, когда и где бы ни происходило исключение? - PullRequest
1 голос
/ 20 января 2011

Я делаю некоторые улучшения в существующем коде.И теперь я хочу регистрировать одно сообщение всякий раз, когда и где бы ни возникало исключение.

Я могу добавить это сообщение в блок catch / finally, но есть сотни блоков catch.

Может кто-нибудь предложить лучший подход для регистрации сообщения при возникновении исключений в любой части кода в сборке?

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Второй дубль:

Хороший подход - AOP с Postsharp.

Я использовал во многих проектах.

Вы можете определить атрибут, который наследуется от базового API PostSharp, который позволяет вам перехватывать любой вызов метода, в который вы помещаете свой пользовательский атрибут.

Если вы поместите этот атрибут в любой метод, вы сможете попробовать / перехватить абсолютно любое тело метода и, в конце концов, контролировать исключения и регистрировать их.

Вы можете достичь той же цели с помощью Castle Dynamic Proxy, но это решение во время выполнения, поскольку вы можете создавать прокси-классы с перехватчиками и создавать экземпляры ваших классов с помощью фабрики. Очевидно, что это потребляет больше ресурсов.

Postsharp выполняет IL-ткачество, что означает, что ваши перехватчики будут внедрены в ваш реальный код во время компиляции, поэтому вы не потеряете производительность во время выполнения.

Подводя итог, вы можете создать «LogAttribute» и поместить его в любой метод, который хотите регистрировать или делать, если происходит исключение.

1 голос
/ 20 января 2011

Это интересная проблема, когда у вас есть устаревший код, с которым вам приходится иметь дело.

Если вы ДЕЙСТВИТЕЛЬНО не хотите менять блоки улова, я мог бы предложить обходной путь:

Один из вариантов, который вы получили, - это написать LoggedExceptionInterface или что-то еще и внедрить в него LogEvent, а затем проверять весь ваш код сканирования на наличие обработанных типов исключений и переопределять их, добавляя к ним ваш интерфейс.
Например, вы должны заменить IOException на LoggedIOException, где последний наследует первый, реализуя LoggedExceptionInterface сверху.

Конечно, это может оказаться тяжелее, чем индивидуальная смена блоков улова; выбор за вами.

0 голосов
/ 20 января 2011

Конечно, у вас есть обработчики исключений последнего шанса.

В ASP.NET он есть в HttpApplication с событием Error (в большинстве случаев в Global ASAX, если выбез использования модуля HTTP).

В приложении WPF и Silverlight есть.

И Windows Forms может использовать событие AppDomain.UnhandledException.

Мика Якобиверно, это плохой ответ.Извините за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...