Отладка Visual Studio - игнорировать исключение в одном месте, а в другом - ломать его? - PullRequest
41 голосов
/ 29 октября 2009

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

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

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

Ответы [ 5 ]

39 голосов
/ 29 октября 2009

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

Первое, что вам нужно сделать, это, по крайней мере временно, перейти в меню Инструменты -> Параметры -> Отладка в Visual Studio, и установите флажок «Просто мой код». Я предполагаю, что это доступно даже в Express-выпусках, но может и не быть, и если оно не доступно для вас, боюсь, остальное, что я скажу, вероятно, не поможет.

В любом случае, после того, как вы отметите эту галочку, вы больше не будете видеть уведомления об отказе от броска для кода, который не является «вашим». Это означает код из сборки, отсутствующей в вашем .sln, или код, помеченный атрибутом [DebuggerNonUserCode] из System.Diagnostics. Что я обычно делаю, так это временно украшаю методы-нарушители с помощью [DebuggerNonUserCode] до тех пор, пока я не закончу отладку того, что мне нужно для отладки, а затем верну эти изменения перед возвратом для контроля со стороны.

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

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

4 голосов
/ 29 октября 2009

Если вы говорите об исключительной функции «Break On Throw», то нет, это не так. Это только функция, основанная на типах, и она не может контролировать, какой раздел кода генерирует исключение.

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

2 голосов
/ 29 октября 2009

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

1 голос
/ 29 октября 2009

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

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

Скажите другому разработчику исправить его код.

Редактировать: В .NET 4 вы можете прикрепить обработчик к событию AppDomain.FirstChanceException , отфильтровать исключения, отличные от ArgumentException, и отфильтровать плохой на основе вызова стек.

0 голосов
/ 29 октября 2009

Ссылки в комментариях отличные.

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

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