Можно ли остановить Visual Studio на необработанных исключениях внутри кода задачи? - PullRequest
6 голосов
/ 26 января 2012

Visual Studio имеет определенную функцию, которая значительно упрощает отладку необработанных исключений: она останавливается на ошибочной строке кода и показывает исключение.

Кажется, что класс Task разработан таким образом, что эта функция всегда подавляется: он перехватывает каждое исключение, а затем перебрасывает другое исключение, когда задача Wait отредактирована или завершена.

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

Другая альтернатива еще менее приемлема: просто смотреть на трассировку стека InnerException: это означает, что, хотя я знаю, какая строка вызвала исключение, я не могу получить доступ ни к одному из его локальных состояний, как я мог бы, если бы программа была на самом деле остановился там.

Могу ли я каким-то образом получить лучшее из обоих миров, используя класс Task, но не имея необходимости жить с набором функций отладки с ухудшенными исключениями?


Дополнительный вопрос: означает ли это, что исключение нулевой ссылки внутри блока await не приведет к немедленной остановке Visual Studio, а вместо этого вообще остановится где-то еще?

1 Ответ

3 голосов
/ 31 января 2012

Тип Task превращает все исключения в AggregateException. Однако, если вы используете функциональность async / await, то при await a Task внутреннее исключение разворачивается и перебрасывается, сохраняя исходную трассировку стека.

VS11 будет иметь лучшую async поддержку отладки, но я не думаю, что возможно пойти так далеко, как вы надеетесь. Task это все о параллельном и асинхронном коде, и поэтому я не думаю, что это когда-нибудь сработает.

Рассмотрим, например, если у вас есть Task, работающий в потоке пула потоков, который вы собираетесь await. Вы можете await это в блоке try перехватить исключение из Task ... или вы можете await это вне блока try, оставляя исключение Task необработанным .

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

Итак, я не думаю, что можно делать то, что вы хотите. Впрочем, с IntelliTrace вы можете приблизиться (только в VS Ultimate).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...