Я новичок в разработке программного обеспечения, а также новичок в 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, или есть ли другой способ поймать эти исключения?
Настоящая проблема заключалась в том, что у меня не было блокировки верхнего уровня в моих асинхронных обратных вызовах. Поскольку они выполняются на отдельных потоках (потоки потоков потоков), их исключения не «пузырятся» в другом месте. AOP кажется хорошим решением для этого сценария, чтобы избежать так много блоков catch верхнего уровня. Это то, что я намерен вложить немного времени в немного дальше по дороге. –