Неуловимое исключение - PullRequest
4 голосов
/ 16 июня 2010

Продолжение: Неуловимое исключение, пт 2

Я пишу собственный механизм привязки; Мой конвертер вызывается до того, как DataContext установлен для целевого элемента. Само по себе это не имеет большого значения, потому что он будет обновляться, когда DataContext в конечном итоге получит значение. вызывает проблемы - это NullReferenceException, которое я получаю из-за того, что DataContext имеет значение null, которое, похоже, не хочет быть перехваченным.

Несмотря на то, что я пытаюсь поймать исключение в моем преобразователе значений:

try {
    return ( (MethodInfo)_member ).Invoke( parameter, null );
} catch {
    return null;
}

По какой-то причине отладчик все еще останавливается на этом этапе.

альтернативный текст http://i50.tinypic.com/2ewm6oo.png

(Это резервное копирование трассировки стека немного туда, где находится блок catch - фактическое исключение происходит внутри метода _member. Нечетная часть - блок catch неактивен, но точка останова никогда не достигается.)

Теперь я думаю, что это может быть потому, что исключение происходит в другой сборке, откуда оно перехватывается (я пытаюсь упаковать это в библиотеку классов многократного использования, и _member выше указывает на метод в сборке приложения ).

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

Мне интересно, есть ли какой-то атрибут или что-то (или, может быть, какой-то параметр отражения, который я пропускаю?), Который я могу использовать, чтобы исключение было перехвачено, как и предполагалось.

Обновление: Я почти уверен, что это должно быть из-за отражения и использования MethodInfo.Invoke. Похоже, что исключение является первым из «TargetInvocationException» с внутренним исключением из NullReferenceException. Кажется, что исключение вызова каким-то образом происходит за пределами стека вызовов и, следовательно, не перехватывается внутри него. Я ничего не делаю с потоками, но, возможно, внутри MethodInfo.Invoke происходит какое-то неявное смещение потоков?

У кого-нибудь есть идеи, как я могу заставить это быть пойманным, или, возможно, другой способ вызвать метод из имени метода, у которого не будет этой проблемы? Я немного в замешательстве.

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Проверьте в настройках исключений отладчика, чтобы увидеть, говорите ли вы отладчику прерывать работу, когда выдается NullReferenceException.

0 голосов
/ 16 июня 2010

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

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

...