Visual Studio: comment interrompre les exceptions gérées?

165

Je voudrais que Visual Studio s'arrête lorsqu'une exception gérée se produit (c'est-à-dire que je ne veux pas seulement voir un message «Première chance», je veux déboguer l'exception réelle).

Par exemple, je veux que le débogueur s'arrête à l'exception:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Je suis tombé sur ces notes pour Visual Studio.NET:

1) Dans VS.NET, allez dans le menu Déboguer >> "Exceptions ..." >> "Exceptions Common Language Runtime" >> "Système" et sélectionnez "System.NullReferenceException"

2) Dans le bas de cette boîte de dialogue, il y a une zone de groupe "Lorsque l'exception est levée:", sélectionnez "Entrer dans le débogueur"

3) Exécutez votre scénario. Lorsque l'exception est levée, le débogueur s'arrête et vous avertit avec une boîte de dialogue qui dit quelque chose comme: "Une exception de type" System.NullReferenceException "a été levée. [Break] [Continue]"

Appuyez sur [Pause]. Cela vous mettra sur la ligne de code qui cause le problème.

Mais ils ne s'appliquent pas à Visual Studio 2005 (il n'y a pas d' option d' exceptions dans le menu Déboguer ).

Quelqu'un sait-il où trouver cette boîte de dialogue d'options dans Visual Studio que la zone de groupe « Lorsque l'exception est levée », avec l'option « Entrer dans le débogueur »?

Mise à jour: le problème était que mon menu Déboguer ne contenait pas d' élément d' exceptions . J'ai personnalisé le menu pour l'ajouter manuellement.

Ian Boyd
la source
9
Dans VS2015, il était sous Débogage-> Windows-> Paramètres d'exception
PeterVermont
Il m'a fallu un certain temps pour trouver comment restaurer les paramètres d'exception par défaut après avoir modifié certains paramètres d'exception, donc une nouvelle réponse. restaurer les paramètres d'exception par défaut
Mabito

Réponses:

170

Avec une solution ouverte, accédez à l' option de menu Déboguer - Exceptions ( Ctrl+ D, E). À partir de là, vous pouvez choisir d'interrompre les exceptions levées ou non gérées par l' utilisateur .

EDIT: Mon instance est configurée avec le "profil" C # peut-être n'est-il pas là pour d'autres profils?

Austin Salonen
la source
10
je n'ai tout simplement pas une telle option. Cela expliquerait ma confusion.
Ian Boyd le
58
j'avais le menu de débogage, mais aucune option d'exceptions. J'ai personnalisé le menu pour l'ajouter manuellement; la touche de raccourci fonctionnait dans les deux sens (Ctrl + Alt + E)
Ian Boyd
3
En outre, vous pouvez réinitialiser l'environnement VS2010, en allant dans "Outils", "Importer les paramètres d'exportation" et sélectionner une réinitialisation à l'environnement C # ... il contient l'élément de sous-menu Exceptions
BeardinaSuit
14
J'ai sélectionné Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>sous Visual Studio 2017 et tous mes rêves les plus fous sont devenus réalité.
Aaron Newton
9
Visual Studio 2015: Débogage -> Windows -> Paramètres d'exception
achecopar
47

Il y a une fenêtre 'exceptions' dans VS2005 ... essayez Ctrl+ Alt+ Elors du débogage et cliquez sur la case à cocher 'Thrown' pour l'exception sur laquelle vous voulez vous arrêter.

Rob Walker
la source
C'est exactement ce que je veux. Où est-ce dans le menu? Pour la vie de moi, je ne peux pas le trouver.
Ian Boyd le
Le raccourci clavier peut changer selon le profil (développeur C #, développeur C ++, etc.)
Asaf R
1
J'ai un élément de menu: Déboguer -> Exceptions. C'est avec VS2005 Professional. Utilisez-vous une édition Express?
Rob Walker
5
si vous voulez l'élément de menu Exceptions: Sélectionnez Outils | Personnaliser .... Cliquez sur l'onglet Commandes. Sélectionnez la catégorie Déboguer dans la zone Catégories. Recherchez l'élément de commande Exceptions ..., puis faites-le glisser vers le menu Déboguer en haut de l'application, en le déposant à l'endroit approprié dans le menu. (trouvé dans les commentaires sur: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto
33

Il m'a fallu un certain temps pour trouver le nouvel endroit pour les paramètres d'attente, donc une nouvelle réponse.

Depuis Visual Studio 2015, vous contrôlez les exceptions sur lesquelles s'arrêter dans la fenêtre Paramètres d'exception (Débogage-> Windows-> Paramètres d'exception). Le raccourci est toujours Ctrl- Alt- E.

Le moyen le plus simple de gérer les exceptions personnalisées consiste à sélectionner «toutes les exceptions ne figurant pas dans cette liste».

Voici une capture d'écran de la version anglaise:

entrez la description de l'image ici

Voici une capture d'écran de la version allemande:

entrez la description de l'image ici

Débutant
la source
16

À partir de Visual Studio 2015 et au-delà, vous devez accéder à la boîte de dialogue "Paramètres d'exception" ( Ctrl+ Alt+ E) et cocher les "Exceptions Common Language Runtime" (ou une spécifique que vous souhaitez, par exemple ArgumentNullException) pour le faire casser sur les exceptions gérées .

Étape 1 Étape 1 Étape 2 Étape 2

Sameer Alibhai
la source
8

Vérifiez la gestion des exceptions avec la page Débogueur , il explique comment configurer cela.

Essentiellement, voici les étapes (pendant le débogage):

  1. Dans le menu Déboguer, cliquez sur Exceptions.

  2. Dans la boîte de dialogue Exceptions, sélectionnez Levée pour une catégorie entière d'exceptions, par exemple, Exceptions Common Language Runtime.

    -ou-

    Développez le nœud pour une catégorie d'exceptions, par exemple, Exceptions Common Language Runtime, et sélectionnez Levée pour une exception spécifique dans cette catégorie.

Guy Starbuck
la source
1

Une technique que j'utilise est quelque chose comme la suivante. Définissez une variable globale que vous pouvez utiliser pour un ou plusieurs blocs try catch en fonction de ce que vous essayez de déboguer et utilisez la structure suivante:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Je trouve que cela me donne un peu plus de flexibilité en termes de test car il y a encore des exceptions sur lesquelles je ne veux pas que l'EDI s'interrompe.

Spencer Ruport
la source
3
C'est une technique utile - elle transforme l'exception gérée en exception non gérée, de sorte que le débogueur s'arrête automatiquement dessus. Je ne sais pas pourquoi il a été rejeté, à moins qu'il n'y ait pas de bon moyen de définir votre GlobalTestingBool. Une autre option, peut-être meilleure, consiste à utiliser Debugger.IsAttached.
Joe White
Vous devrez ajouter ceci à chaque essai / capture et recompiler votre code. Pas très utile si vous êtes déjà en train de déboguer quelque chose.
Max
Une exception doit être lancée dans le code s'il existe une condition exceptionnelle - quelque chose d'inacceptable - et elle doit être interceptée à un niveau où une décision peut être prise quant à la manière de la gérer. Un code comme celui-ci complique les chemins d'exécution.
Lee Oades
Je sais que c'est une réponse vraiment ancienne, mais pour les googleurs aléatoires comme moi, vous pouvez simplement ajoutercatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.
0

La documentation en ligne semble un peu floue, je viens donc de faire un petit test. Le fait de choisir d'interrompre sur Levé à partir de la boîte de dialogue Exceptions provoque l'arrêt de l'exécution du programme sur toute exception, gérée ou non. Si vous souhaitez interrompre uniquement les exceptions gérées, il semble que votre seul recours soit de parcourir votre code et de mettre des points d'arrêt sur toutes vos exceptions gérées. Cela semble un peu excessif, il peut donc être préférable d'ajouter une instruction de débogage chaque fois que vous gérez une exception. Ensuite, lorsque vous voyez cette sortie, vous pouvez définir un point d'arrêt à cette ligne dans le code.

markysdad
la source