Предотвратить отладчик, чтобы сломаться на все исключения в сторонней библиотеке - PullRequest
2 голосов
/ 22 августа 2010

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

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

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

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

Это очень возможно. Все, что вам нужно сделать, это заставить Visual Studio видеть соответствующий код как не пользовательский код , а затем включить «Просто мой код» опция в настройках отладчика:

enter image description here

Есть несколько способов убедить Visual Studio, что ваша библиотека не является кодом пользователя . Один из них - просто скомпилировать сборку релиза без файлов PDB. Другой способ - пометить ваш код с помощью DebuggerNonUserCodeAttribute.

Демонстрационный проект демонстрирует этот материал в действии: https://bitbucket.org/rstarkov/demononusercode/src - обратите внимание, как методы в MyLibrary помечены атрибутом non-user-code. Даже если вы скажете Visual Studio остановиться на «Брошенном» для всех исключений, оно все равно пропустит исключение в MyLibrary.

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

2 голосов
/ 22 августа 2010

Я не верю, что есть какой-то способ воспрепятствовать тому, чтобы "Остановка на всех исключениях" сделала именно это.

Можно ли как-то предотвратить это, кроме как попросить пользователей отключить этот параметр?

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

1 голос
/ 22 августа 2010

Нет, вы не можете предотвратить это.

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

0 голосов
/ 26 августа 2010

Это полуклон из этого вопроса.

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

Что вы можете сделать, так это убедиться, что вы всегда отправляете один и тот же пользовательский тип исключения, то есть TigraineNamespace.TigraineException, затем попросите своих пользователей перейти в диалог «Исключения» (Ctrl + Alt + E), нажмите «Добавить»напишите «TigraineNamespace.TigraineException», нажмите Enter, затем снимите флажок для вашего конкретного исключения.

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