web-dev-qa-db-fra.com

N'arrêtez pas le débogueur à CETTE exception lorsqu'il est lancé et capturé

Dans les outils/exceptions, j'ai défini l'option que le débogueur arrête lorsqu'une exception est levée. Qu'il soit attrapé ou non.

Comment exclure une exception à cette règle? Quelque part dans mon code, il y a une exception interceptée qui fait partie de la logique du programme. Donc, je ne veux évidemment pas que cette exception arrête le débogueur à chaque fois qu'il est touché.

Exemple: je veux ignorer l'exception nullreference (qui est interceptée) à la ligne 344. Je veux m'arrêter à toutes les autres exceptions

89
MichaelD

Si je me souviens bien, vous pouvez utiliser un attribut DebuggerStepThrough sur la méthode qui contient le code que vous ne voulez pas qu'une exception se déclenche. Je suppose que vous pouvez isoler le code qui déclenche l'exception ennuyeuse dans une méthode et la décorer avec l'attribut.

40
Chris Chou

DebuggerHidden est votre ami!

Le Common Language Runtime n'attache aucune sémantique à cet attribut. Il est fourni pour être utilisé par les débogueurs de code source. Par exemple, le débogueur Visual Studio 2005 ne s'arrête pas dans une méthode marquée avec cet attribut et ne permet pas de définir un point d'arrêt dans la méthode. Les autres attributs du débogueur reconnus par le débogueur Visual Studio 2005 sont DebuggerNonUserCodeAttribute et DebuggerStepThroughAttribute.

Testé sur VS2010 et fonctionne très bien.

Alors que DebuggerStepThrough semble également fonctionner pour certaines versions spécifiques du débogueur, DebuggerHidden semble fonctionner pour un plus large éventail de situations sur la base des commentaires des deux réponses.

Notez que les deux options ne fonctionnent pas actuellement avec méthodes de bloc d'itérateur ou pour méthodes async/attente . Cela pourrait être résolu dans une mise à jour ultérieure de Visual Studio.

64
Shimmy

DebuggerStepThrough est celui à utiliser pour empêcher le débogueur d'interrompre une méthode où il y a un try/catch.

Mais cela ne fonctionne que si vous n'avez pas décoché l'option "Activer juste mon code (géré uniquement)" dans les paramètres généraux des options de débogage de Visual Studio (menu Outils/Options, débogage de noeud/Général) ...

Plus d'informations sur cet attribut sur http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden empêchera simplement le débogueur d'afficher la méthode où l'exception est levée. Au lieu de cela, il affichera la première méthode sur la pile qui n'est pas marquée avec cet attribut ...

14
Valery Letroye

Les attributs spécifiés dans les autres réponses (et d'autres tels que l'attribut DebuggerNonUserCode) ne fonctionnent plus de la même manière par défaut dans Visual Studio 2015. Le débogueur interrompt les exceptions dans les méthodes de marché avec ces attributs, contrairement à anciennes versions de VS. Pour désactiver l'amélioration des performances qui a modifié leur comportement, vous devez modifier un paramètre de registre:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Plus d'informations peuvent être trouvées sur le blog du studio visuel .

(Cela devrait probablement être un commentaire sur la première réponse, mais je n'ai pas assez de représentants)

12
bhh

Vous n'êtes pas en mesure de distinguer une exception levée à un endroit spécifique de votre code. Vous pouvez cependant désactiver les exemptions d'un type spécifique.

Si votre propre code lève l'exception en question, j'en ferais une exception personnalisée, dérivée de tout ce qui convient, puis désactiver la rupture de débogage sur ce type dérivé.

La désactivation d'exceptions système comme NullReferenceException affectera l'ensemble du système, ce qui n'est bien sûr pas souhaitable pendant le développement.

Notez qu'il existe deux types de comportements de rupture pour les exceptions:

  • Lancé: s'il est sélectionné, s'arrête dès qu'une exception de ce type est levée
  • Non géré par l'utilisateur: si cette option est sélectionnée, elle n'est interrompue que si l'exception, de ce type, n'est pas gérée par un essai/capture.

Vous pouvez supprimer la vérification dans "Lancé" pour l'exception NullReferenceException qui vous donnera l'avantage de ne pas interrompre chaque fois que votre système passe la ligne en question dans votre code, mais toujours de rompre si vous avez une attente NullReference non gérée se produisant dans d'autres parties de la système.

3
Lars Udengaard