5

Я новичок в разработке программного обеспечения, а также новичок в stackoverflow, так что легко на меня.Необработанные исключения в библиотеке классов C# для целей ведения журналов

СПРАВОЧНАЯ ИНФОРМАЦИЯ: Я разрабатываю библиотеку классов C#, которая обрабатывает XML-сообщения, отправленные сторонним приложением по tcp/ip (с использованием сокетов Async). Я использую com-interop, чтобы выставить библиотеку классов в приложение Vb6. Когда библиотека C# обрабатывает xml, который он получает по сокету, он вызывает различные события, к которым присоединяется приложение-потребляющее приложение vb6 (таким образом, когда мы в конечном итоге перепишем все приложение в .Net, мы уже будем с этим компонентом).

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

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

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

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

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

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

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

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

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

EDIT: Я ознаменовывал ответ @Eric Й. как правильно, но после того, как пытался реализовать решение, которое я нашел, что он не будет хорошо работать с асинхронными обратных вызовов из класса сокетов, которые я использую , Как только поток threadpool используется для запуска обратного вызова async, я, похоже, не поймаю никаких исключений, которые возникают позже в стеке. Должен ли я использовать структуру AOP, или есть ли другой способ поймать эти исключения?

+0

Настоящая проблема заключалась в том, что у меня не было блокировки верхнего уровня в моих асинхронных обратных вызовах. Поскольку они выполняются на отдельных потоках (потоки потоков потоков), их исключения не «пузырятся» в другом месте. AOP кажется хорошим решением для этого сценария, чтобы избежать так много блоков catch верхнего уровня. Это то, что я намерен вложить немного времени в немного дальше по дороге. –

ответ

2

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

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

+0

Это не похоже на идеальное решение с парадигматической точки зрения, но опять же, учитывая, что временные ограничения выглядят как лучший вариант для настоящего проекта. Спасибо за ввод. Просто для уточнения, предлагаете ли вы дополнительный слой обертывания или просто то, что требуется для взаимодействия? –

+0

Нет, только один слой, который взаимодействует с COM и обрабатывает исключения. Если у вас есть большое количество методов для обертывания, вы бы хотели написать небольшой генератор кода, например, принимает список методов для каждого класса в COM и выводит соответствующий код C#. Я делал это раньше, когда обертывал очень большой бизнес-уровень COM. Опять же, если он действительно большой, возможно, стоит инвестировать время в МОК. –

+0

Спасибо. Маркировка как ответ, потому что это решение работает лучше всего для меня в это время. –

1

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

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

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

+0

Я использовал МОК для проектов и лично считаю, что он приносит большую пользу крупным проектам с несколькими командами, ответственными за разные области (разные проблемы). Я знаю, что это ступает на территорию священной войны, просто делясь своим личным опытом. –

+0

Все имеет свое место ... вопрос находится на продвинутом предмете ИМХО и требует достаточно продвинутого подхода для правильного решения. Я согласен с некоторыми другими сообщениями, что AOP (примерно так же, как и перехватчики) является допустимым подходом. Философски, некоторые предпочитают никогда не сажать фруктовое дерево. Я часто сажусь. Позже у меня большие урожаи. Многие люди спрашивают меня, как у меня появилось так много красивых фруктовых деревьев, и я говорю им, что я часто сажусь. Некоторые умирают, и многие не делают этого. Пренебрегать обучением, потому что это трудно, это то, что делает кого-то подходящим для служебных и трудовых работ, а не для инженерии. – CrazyDart

+0

Спасибо CrazyDart. Я согласен с тем, что проблема кажется довольно продвинутой и может потребовать передового подхода. К сожалению, все это ново для меня (я развивался только около 6 месяцев, полный рабочий день только за последние 2 месяца). Я добавил в закладки как рамки AOP, так и Castle Windsor для будущего. Учитывая мои временные ограничения на настоящий проект, я склоняюсь к подходу Эрика. Если у вас есть какие-либо конкретные идеи или опасения по этому поводу в приведенном выше сценарии, не стесняйтесь советовать. Еще раз спасибо. –

1

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

+0

Спасибо за информацию. Я закрою эти рамки и вернусь к ним в будущем.На данный момент я боюсь, что кривая обучения может быть слишком велика для реализации, учитывая мои временные ограничения на проект. –

Смежные вопросы