Необработанные исключения в библиотеке классов C # для целей ведения журнала - PullRequest
5 голосов
/ 27 июля 2011

Я новичок в разработке программного обеспечения, а также в стеке потока, так что не беспокойтесь обо мне.

ПРЕДПОСЫЛКИ: Я занимаюсь разработкой библиотеки классов C #, которая обрабатывает XML-сообщения, отправленные сторонним приложением по протоколу tcp / ip (с использованием асинхронных сокетов). Я использую com-interop для предоставления библиотеки классов приложению Vb6. Когда библиотека C # обрабатывает xml, который она получает через сокет, она вызывает различные события, на которые подписывается приложение-потребитель vb6 (таким образом, когда мы в конечном итоге переписываем все приложение в .Net, мы уже закончили с этим компонентом).

ВОПРОС: Я хочу поймать все необработанные исключения ТОЛЬКО ДЛЯ ЦЕЛЕЙ ВХОДА. В приложении winforms вы можете подключить событие к AppDomain.CurrentDomain.UnhandledException и к Application.ThreadException. Нет ли способа аналогичным образом получить данные об исключениях для регистрации информации в библиотеке классов?

Важные моменты:

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

  • Я делаю все возможное, чтобы ловить все конкретные исключения локально, где бы я ни знал, что они могут возникнуть. Поэтому моя цель - просто зарегистрировать действительно неожиданные исключения.

  • Я знаю, что некоторые скажут, что это будет плохой шаблон проектирования. Вместо этого я должен позволить вызывающей стороне разобраться с этими исключениями. Проблема в том, что приложение vb6 не имеет такой надежной обработки ошибок, как хотелось бы. Прежде всего, я хочу записать трассировку стека, чтобы в случае сбоя приложения vb6 из-за моей dll я мог просматривать журнал, чтобы получать уведомления о потенциальных областях моего кода на c #, которые, возможно, потребуется изменить.

Может кто-нибудь дать мне какое-нибудь направление? Наилучший вариант, который я нашел на данный момент, заключается в том, чтобы поместить универсальный блок try catch в каждый публичный метод, зарегистрировать исключение и затем выбросить его. Это кажется не идеальным:

public void SomeMethod()
{
    try
    {
        // try something here...
    }
    catch (Exception ex)
    {
        Log(ex);
        throw;
    }
}

Мало того, что это кажется плохим дизайном, но, кроме того, я не знаю, что произойдет, если один из асинхронных обратных вызовов вызовет исключение в другом потоке, чем вызванный метод. Будет ли этот общий блок try / catch перехватить такое исключение?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Первоначально я пометил ответ @Eric J. как правильный, но после попытки реализовать решение я обнаружил, что оно не будет работать с асинхронными обратными вызовами из класса сокетов, которые Я использую. Как только поток пула потоков используется для запуска асинхронного обратного вызова, я не могу отловить какие-либо исключения, которые происходят позже в стеке. Нужно ли использовать платформу AOP или есть какой-то другой способ перехвата этих исключений?

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Если у вас ограниченный набор точек входа в библиотеку, подумайте о том, чтобы делать именно то, что вы предлагаете - использовать класс-оболочку .NET или библиотеку-обертку для выполнения фактического взаимодействия и перехватывать / регистрировать исключение в этом классе-обертке. Вернуть код исключения или ошибки, который знает, как обрабатывать вызывающая библиотека VB6 (от того, перебрасывает ли это исключение или нет, зависит от того, с чем может работать код VB6).

CrazyDart предлагает IOC, которая является интересной и действительной альтернативой, но также изначально добавляет сложность и кривую обучения. Конечно, взгляните на МОК и подумайте, как это возможно.

1 голос
/ 28 июля 2011

Вы можете либо взглянуть на использование AOP-фреймворка, такого как Spring.NET или Unity, либо альтернативно взглянуть на такой продукт, как PostSharp (хотя я никогда лично не пробовал PostSharp).

1 голос
/ 27 июля 2011

Вы можете использовать Замок Виндзор и перехватчик для этого. Хорошая причина использовать МОК в проектах.

http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx

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

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