Partager via


Gérer les exceptions avec le débogueur dans Visual Studio

Une exception est une indication d’un état d’erreur qui se produit pendant l’exécution d’un programme. Vous pouvez indiquer au débogueur sur quelles exceptions ou ensembles d’exceptions s’arrêter, et à quel moment vous souhaitez que le débogueur mette en pause (c’est-à-dire, suspendre l'exécution dans le débogueur). Lorsque le débogueur s’arrête, il vous indique où l’exception a été levée. Vous pouvez également ajouter ou supprimer des exceptions. Avec une solution ouverte dans Visual Studio, utilisez les paramètres d’exception Windows > de débogage > pour ouvrir la fenêtre Paramètres d’exception.

Fournissez des gestionnaires qui répondent aux exceptions les plus importantes. Si vous devez savoir comment ajouter des gestionnaires pour des exceptions, consultez Corriger les bogues en écrivant un meilleur code C#. Découvrez également comment configurer le débogueur pour qu’il interrompe toujours l’exécution pour certaines exceptions.

Lorsqu’une exception se produit, le débogueur écrit un message d’exception dans la fenêtre Sortie . Il peut interrompre l’exécution dans les cas suivants :

  • Une exception est levée qui n’est pas gérée.
  • Le débogueur est configuré pour interrompre l’exécution avant l’appel d’un gestionnaire.
  • Vous avez défini Just My Code et le débogueur est configuré pour interrompre toute exception qui n’est pas gérée dans le code utilisateur.

Note

ASP.NET dispose d’un gestionnaire d’exceptions de niveau supérieur qui affiche des pages d’erreur dans un navigateur. Elle n’interrompt pas l’exécution, sauf si just My Code est activé. Pour obtenir un exemple, consultez Indiquer au débogueur de continuer sur les exceptions non gérées par l’utilisateur ci-dessous.

Note

Dans une application Visual Basic, le débogueur gère toutes les erreurs en tant qu’exceptions, même si vous utilisez des gestionnaires d’erreurs de style On Error.

Indiquez au débogueur de s’arrêter lorsqu’une exception est levée

Le débogueur peut interrompre l’exécution au moment où une exception est levée. Vous pouvez donc examiner l’exception avant qu’un gestionnaire soit appelé.

Dans la fenêtre Paramètres d’exception (Déboguer > les paramètres d’exception Windows>), développez le nœud pour une catégorie d’exceptions, comme les exceptions Common Language Runtime. Activez ensuite la case à cocher pour une exception spécifique dans cette catégorie, telle que System.AccessViolationException. Vous pouvez également sélectionner une catégorie entière d’exceptions.

Capture d’écran de la case à cocher Paramètres d’exception.

Conseil / Astuce

Vous pouvez trouver des exceptions spécifiques à l’aide de la fenêtre De recherche dans la barre d’outils Paramètres d’exception ou utiliser la recherche pour filtrer des espaces de noms spécifiques (par exemple , System.IO).

Si vous sélectionnez une exception dans la fenêtre Paramètres des exceptions, l’exécution du débogueur s’arrêtera partout où l’exception est déclenchée, qu’elle soit gérée ou non. À présent, l’exception est appelée exception de première chance. Par exemple, voici quelques scénarios :

  • Dans l’application console C# suivante, la méthode Main lève une AccessViolationException à l’intérieur d’un bloc de code try/catch.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    Si AccessViolationException est activé dans les paramètres d’exception, l’exécution s’arrête sur la throw ligne lorsque vous exécutez ce code dans le débogueur. Vous pouvez ensuite continuer l’exécution. La console doit afficher les deux lignes :

    caught exception
    goodbye
    

    mais il n’affiche pas la here ligne.

  • Une application console C# fait référence à une bibliothèque de classes avec une classe qui a deux méthodes. Une méthode lève une exception et la gère, tandis qu’une deuxième méthode lève la même exception, mais ne la gère pas.

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Voici la méthode Main() de l’application console :

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    Si AccessViolationException est activé dans les paramètres d’exception, l’exécution s’arrête sur la throw ligne dans ThrowHandledException() et ThrowUnhandledException() lorsque vous exécutez ce code dans le débogueur.

Pour restaurer les paramètres d’exception par défaut, choisissez le bouton Restaurer la liste sur le bouton paramètres par défaut :

Capture d’écran de la restauration par défaut dans les paramètres d’exception.

Indiquez au débogueur de continuer sur les exceptions non gérées par l’utilisateur

Si vous déboguez du code .NET ou JavaScript avec Just My Code, vous pouvez indiquer au débogueur d’empêcher les ruptures sur les exceptions qui ne sont pas gérées dans le code utilisateur, mais qui sont gérées ailleurs.

  1. Dans la fenêtre Paramètres d’exception, ouvrez le menu contextuel en cliquant avec le bouton droit sur une étiquette de colonne, puis sélectionnez Afficher les actions supplémentaires des colonnes>. (Si vous avez désactivé Uniquement mon code, vous ne verrez pas cette commande.) Une troisième colonne nommée Actions supplémentaires s’affiche.

    Capture d’écran de la colonne Actions supplémentaires.

    Pour une exception qui indique Continuer lorsqu’elle n’est pas gérée dans le code utilisateur dans cette colonne, le débogueur continue si cette exception n’est pas gérée dans le code utilisateur mais l’est à l’extérieur.

  2. Pour modifier ce paramètre pour une exception particulière, sélectionnez l’exception, cliquez avec le bouton droit pour afficher le menu contextuel, puis sélectionnez Continuer lorsqu'elle n'est pas gérée dans le code utilisateur. Vous pouvez également modifier le paramètre d’une catégorie entière d’exceptions, comme l’ensemble des exceptions Common Language Runtime).

    Capture d’écran de Continuer quand le paramètre de code utilisateur n’est pas géré.

Par exemple, ASP.NET applications web gèrent les exceptions en les convertissant en code d’état HTTP 500 (gestion des exceptions dans ASP.NET API web), ce qui peut ne pas vous aider à déterminer la source de l’exception. Dans l’exemple ci-dessous, le code utilisateur effectue un appel à String.Format(), qui génère une FormatException. L’exécution s’interrompt de la manière suivante :

Interrompt sur l’exception non gérée par l’utilisateur

Ajouter et supprimer des exceptions

Vous pouvez ajouter et supprimer des exceptions. Pour supprimer un type d’exception d’une catégorie, sélectionnez l’exception, puis choisissez le bouton Supprimer l’exception sélectionnée de la liste (signe moins) dans la barre d’outils Paramètres d’exception. Vous pouvez également cliquer avec le bouton droit sur l’exception et sélectionner Supprimer dans le menu contextuel. La suppression d’une exception a le même effet que si elle était décochée, ce qui signifie que le débogueur ne s’arrêtera pas lorsqu'elle est levée.

Pour ajouter une exception :

  1. Dans la fenêtre Paramètres d’exception , sélectionnez l’une des catégories d’exceptions (par exemple , Common Language Runtime).

  2. Choisissez le bouton Ajouter une exception à la catégorie sélectionnée (signe plus).

    Capture d’écran de l’option Ajouter une exception au bouton de catégorie sélectionné.

  3. Tapez le nom de l’exception (par exemple , System.UriTemplateMatchException).

    Capture d’écran du nom de l’exception type.

    L’exception est ajoutée à la liste (par ordre alphabétique) et cochée automatiquement.

Pour ajouter une exception aux exceptions d’accès à la mémoire GPU, aux exceptions du runtime JavaScript ou aux catégories Exceptions Win32, incluez le code d’erreur et la description.

Conseil / Astuce

Vérifiez votre orthographe ! La fenêtre Paramètres d’exception ne vérifie pas l’existence d’une exception ajoutée. Par conséquent, si vous tapez Sytem.UriTemplateMatchException, vous obtenez une entrée pour cette exception (et non pour System.UriTemplateMatchException).

Les paramètres d’exception sont conservés dans le fichier .suo de la solution, de sorte qu’ils s’appliquent à une solution particulière. Vous ne pouvez pas réutiliser des paramètres d’exception spécifiques entre les solutions. Désormais, seules les exceptions ajoutées sont conservées ; les exceptions supprimées ne sont pas. Vous pouvez ajouter une exception, fermer et rouvrir la solution, et l’exception sera toujours là. Toutefois, si vous supprimez une exception et fermez/rouvrez la solution, l’exception réapparaît.

La fenêtre Paramètres d’exception prend en charge les types d’exceptions génériques en C# mais pas en Visual Basic. Pour interrompre les exceptions comme MyNamespace.GenericException<T>, vous devez ajouter l’exception en tant que MyNamespace.GenericException'1. Autrement dit, si vous avez créé une exception comme ce code :

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

Vous pouvez ajouter l’exception aux paramètres d’exception à l’aide de la procédure précédente :

Capture d’écran de l’ajout d’une exception générique.

Ajouter des conditions à une exception

Utilisez la fenêtre Paramètres d’exception pour définir des conditions sur les exceptions. Les conditions actuellement prises en charge incluent le ou les noms de module à inclure ou exclure pour l’exception. En définissant des noms de module en tant que conditions, vous pouvez choisir d’interrompre l’exception uniquement sur certains modules de code. Vous pouvez également choisir d’éviter les ruptures sur des modules particuliers.

Note

L’ajout de conditions à une exception est pris en charge à partir de Visual Studio 2017.

Pour ajouter des exceptions conditionnelles :

  1. Choisissez le bouton Modifier les conditions dans la fenêtre Paramètres d’exception, ou cliquez avec le bouton droit sur l’exception et choisissez Modifier les conditions.

    Capture d’écran des conditions d’exception.

  2. Pour ajouter des conditions supplémentaires requises à l’exception, sélectionnez Ajouter une condition pour chaque nouvelle condition. Des lignes de condition supplémentaires s’affichent.

    Capture d’écran des conditions supplémentaires pour une exception.

  3. Pour chaque ligne de condition, tapez le nom du module et remplacez la liste des opérateurs de comparaison par Equals or Not Equals. Vous pouvez spécifier des caractères génériques (\*) dans le nom pour spécifier plusieurs modules.

  4. Si vous devez supprimer une condition, choisissez le X à la fin de la ligne de condition.