В C # (или .NET в целом) вы можете маскировать уровень стека вызовов, где исключение было выдано через атрибуты? - PullRequest
4 голосов
/ 08 июля 2011

Название может быть немного запутанным, поэтому я объясню.Скажем, у вас была эта цепочка вызовов ...

public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index)

Теперь, если вы звоните DoWork, она переходит к вызовам до CheckIndex, добавляя каждый более глубокий вызов в стек вызовов.

Теперь, если кто-то вызывает DoWork с неправильным значением для index, он полностью исключает исключение на CheckIndex, и в настоящее время именно здесь происходит сбой отладчика.Затем вам нужно вернуться обратно к стеку вызовов, чтобы увидеть, что настоящий нарушитель в том, что кто-то передал неверные данные на DoWork.

Теперь, во времена VB6, вы могли просто украсить DoWorkHelper и CheckIndexс атрибутом, говорящим: «Если во мне возникнет какое-либо исключение, не выделяй меня, а скорее моего абонента, потому что именно они передали мне плохую чушь!»Таким образом, в этом случае код будет прерываться внутри DoWork с выделенным вызовом DoWorkHeper.

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

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

Обратите внимание, что это похоже на 'Break On All Exceptions', за исключением того, что вы обрабатываете это с помощью украшения.Кроме того, вы не устанавливаете ограничение на конкретный тип исключения (например, все исключения с нулевой ссылкой и т. Д.), А скорее на конкретный метод!(или, точнее, тот, который вызвал декорированный метод.)

Так есть ли в C # или .NET вообще?


Обновление

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

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Пожалуйста, смотрите опцию Просто мой код .Вам нужно украсить DoWorkHelper с DebuggerHiddenAttribute или DebuggerNonUserCodeAttribute.

2 голосов
/ 08 июля 2011

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

С этим связано три атрибута: DebuggerHidden, DebuggerStepThrough и DebuggerNonUserCode.

Вот правила:

Когда Just My Code равно не проверено:

  • DebuggerNonUserCode
    Это в основном игнорируется. Точки останова, вступления и исключения работают так же, как если бы этот атрибут отсутствовал.

  • DebuggerStepThrough
    Это учитывает точки останова и будет нарушать исключения, где они возникают, но вы не можете вручную перейти к блокам, отмеченным этим атрибутом.

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

Когда Just My Code равно проверено

  • Все три атрибута ведут себя так же, как если бы вы использовали DebuggerHidden выше.

Есть еще один атрибут, DebuggerStepperBoundary, который довольно крутой. Вот выдержка из MSDN:

Используйте атрибут DebuggerStepperBoundaryAttribute для перехода от пошагового выполнения кода к выполнению кода. Например, в Visual Studio 2005 обнаружение DebuggerStepperBoundaryAttribute при пошаговом выполнении кода с помощью клавиши F10 (или команды «Перешагнуть») имеет тот же эффект, что и нажатие клавиши F5 или использование команды «Начать отладку».

Надеюсь, это прояснит ситуацию! Конечно, сделал для меня!

...