Как войти в исключение TargetInvocationException?
Я получаю TargetInvocationException, как
Необработанное исключение типа System.Reflection.TargetInvocationException произошло в mscorlib.dll
Дополнительная информация: Исключение было сгенерировано целью вызова.
потому что я вызываю код с
Dispatcher.Invoke(MyRoutine...)
Как я могу сделать отладчик VS 2010 шаг в MyRoutine туда, где на самом деле происходит исключение???
Я знаю, что я могу построить попытку... поймать вокруг Dispatcher.Invoke
а затем посмотрите на внутреннее исключение, но это довольно трудоемко. Я хочу, чтобы отладчик остановился на месте ошибки.
Есть идеи, как это сделать?
1 ответ
Dispatcher.Invoke() настроит блок перехвата так, чтобы он мог перенаправить любое исключение обратно в поток, который его вызвал. Чтобы вызывающий знал, что возвращаемое значение Invoke () недоступно. Этот блок catch предотвращает автоматическое прерывание отладчика при возникновении исключения. Исходное исключение доставляется как InnerException объекта TargetInvocationException. Что может быть достаточно для диагностики причины.
Рассмотрите возможность использования BeginInvoke() вместо этого, ему не нужно выполнять такой маршалинг, так как вызывающий его код больше не активен. Это также намного менее склонно к тупику.
Но если вам действительно нужно возвращаемое значение, тогда только Invoke () может предоставить его. Тогда способ отладки исключения состоит в том, чтобы использовать "Отладка + исключения" и установить флажок "Брошенный" для исключений CLR. Что заставляет отладчик останавливаться при возникновении исключения.