Я новичок в разработке программного обеспечения, а также в стеке потока, так что не беспокойтесь обо мне.
ПРЕДПОСЫЛКИ: Я занимаюсь разработкой библиотеки классов 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 или есть какой-то другой способ перехвата этих исключений?