.NET - Прослушиватель исключений первого шанса для интенсивной отладки?
-
11-09-2019 - |
Вопрос
Вероятно, это нереалистично, но возможно ли было бы включить уведомление компонента обо всех исключениях первой случайности, возникающих в его процессе?
У нас есть некоторые сторонние (заключенные нами по контракту) компоненты, которые не могут делать ничего, кроме как принимать исключения, а политика деловых отношений превращает все это испытание в настоящую муку.
Мы также осознаем, что часть нашего кода выполняет разочаровывающее действие, позволяя исключениям исчезнуть в бездне, вместо того чтобы использовать наш централизованный регистратор исключений.
Я предполагаю, что наше приложение должно было бы быть запущено как дочерний процесс отладочного приложения для достижения эффекта, но я полагаю, что стоит спросить :)
Решение
Net 4.0 фактически добавила AppDomain.FirstChanceException
событие.Он срабатывает до выполнения любого блока catch.
Это Статья MSDN имеет несколько примеров.
По сути, вы просто добавляете обработчик событий следующим образом:
AppDomain.CurrentDomain.FirstChanceException +=
(object source, FirstChanceExceptionEventArgs e) =>
{
Console.WriteLine("FirstChanceException event raised in {0}: {1}",
AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
};
Другие советы
Вы можете использовать .net profiling API для получения уведомлений об исключениях во всех видах состояний, вот доступные методы:
ExceptionThrown
ExceptionSearchFunctionEnter
ExceptionSearchFunctionLeave
ExceptionSearchFilterEnter
ExceptionSearchFilterLeave
ExceptionSearchCatcherFound
ExceptionOSHandlerEnter
ExceptionOSHandlerLeave
ExceptionUnwindFunctionEnter
ExceptionUnwindFunctionLeave
ExceptionUnwindFinallyEnter
ExceptionUnwindFinallyLeave
ExceptionCatcherEnter
ExceptionCatcherLeave
ExceptionCLRCatcherFound
ExceptionCLRCatcherExecute
Использование API профилирования не совсем для слабонервных;взгляните на http://msdn.microsoft.com/en-us/library/ms404386.aspx в качестве отправной точки для вашего исследования и http://msdn.microsoft.com/en-us/library/bb384687.aspx специально для обработки исключений.
Я не знаю простого способа сделать это в вашем управляемом коде, например
AppDomain.FirstChanceException += new EventHandler...
событие или подобное.
Редактировать:Возможно, лучшей альтернативой является использование неуправляемый API отладки вместо этого.
В принципе, вы можете установить ICorManagedCallback - Управляемый обратный вызов/ICorManagedCallback2 Управляемый обратный вызов обратный вызов с использованием ICorDebug::SetManagedHandler - обработчик и получать обратные вызовы при возникновении исключений.
Я недостаточно опытен в этой области, чтобы знать, каковы преимущества / недостатки API профилирования.
Я только что взглянул на пример ЦРТ который использует API ICorDebug и, похоже, получает достаточно уведомлений об исключениях (чтобы быстро увидеть, какие события происходят, установите точку останова в методе handleEvent в corapi/Debugger.cs:406)