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 qu'un programme est en cours d'exécution. Vous pouvez indiquer au débogueur les exceptions ou les ensembles d’exceptions à interrompre et à quel moment vous souhaitez que le débogueur s’interrompe (autrement dit, suspendre 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 Déboguer > Fenêtres > Paramètres d’exception pour ouvrir la fenêtre Paramètres d’exception.

Fournissez des gestionnaires qui répondent aux exceptions les plus importantes. Si vous avez besoin de savoir comment ajouter des gestionnaires pour les 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.

Quand une exception est levée, le débogueur écrit un message d’exception dans la fenêtre Sortie. Cette action 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 qu’un gestionnaire ne soit appelé.
  • Vous avez défini Just My Codeet que le débogueur est configuré pour arrêter l’exécution de toute exception non gérée dans le code utilisateur.

Notes

ASP.NET a un gestionnaire d'exceptions de niveau supérieur qui affiche les pages d'erreur dans un navigateur. Il n'interrompt pas l'exécution, à moins que l'option Uniquement mon code soit activée. Pour obtenir un exemple, consultez Indiquer au débogueur de continuer sur les exceptions non prise en charge par l’utilisateur, ci-dessous.

Notes

Dans une application Visual Basic, le débogueur gère toutes les erreurs comme des exceptions, même si vous utilisez des gestionnaires d’erreurs de style « en cas d’erreur ».

Indiquer au débogueur qu’il s’arrête en cas de levée d’une exception

Le débogueur peut interrompre l'exécution à l'endroit où une exception est levée, pour que vous puissiez examiner l'exception avant qu'un gestionnaire soit appelé.

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

Screenshot of Exception Settings check box.

Screenshot of Exception Settings check box.

Astuce

Vous pouvez trouver des exceptions spécifiques à l'aide de la fenêtre Rechercher de la barre d'outils Paramètres d'exception ou en utilisant la fonction de recherche pour filtrer des espaces de noms spécifiques (comme System.IO).

Si vous sélectionnez une exception dans la fenêtre Paramètres d’exception, l’exécution du débogueur s’interrompt partout où l’exception est levée, qu’elle soit gérée ou non. Maintenant, l’exception est appelée « exception de première chance ». Voici, par exemple, quelques scénarios :

  • Dans l’application console C# suivante, la méthode Main lève une exception AccessViolationException à l’intérieur d’un bloc 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 cochée dans Paramètres d'exception, l’exécution s’arrête à la ligne throw, lorsque vous exécutez ce code dans le débogueur. Vous pouvez ensuite poursuivre l'exécution. La console devrait afficher les deux lignes :

    caught exception
    goodbye
    

    Mais elle n'affiche pas la ligne here.

  • 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 cochée dans Paramètres d'exception, l’exécution s’arrête à la ligne throw dans ThrowHandledException() et dans ThrowUnhandledException().

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

Screenshot of Restore Defaults in Exception Settings.

Screenshot of Restore Defaults in Exception Settings.

Indiquer au débogueur qu’il continue en cas d’exceptions non gérées par l’utilisateur

Si vous déboguez du code .NET ou JavaScript avec Just My Code, vous pouvez demander au débogueur d’empêcher les arrêts 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 colonnes > Actions supplémentaires. (Si vous avez désactivé Just My code, cette commande ne s’affiche pas.) Une troisième colonne nommée Actions supplémentaires s’affiche.

    Screenshot of Additional Actions column.

    Screenshot of Additional Actions column.

    Pour une exception qui indique Continuer en cas de non prise en charge 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 est gérée en externe.

  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 en cas de non prise en charge dans le code utilisateur. Vous pouvez également modifier le paramètre pour une catégorie entière d’exceptions, comme l’ensemble des exceptions du Common Language Runtime).

    Screenshot of Continue when unhandled in user code setting.

    Screenshot of Continue when unhandled in user code setting.

Par exemple, les applications web ASP.NET gèrent les exceptions en les convertissant en code d’état HTTP 500 (Gestion des exceptions dans l’API ASP.NET), ce qui peut vous compliquer l’identification de la source de l’exception. Dans l'exemple ci-dessous, le code utilisateur appelle String.Format() qui lève une exception FormatException. L'exécution s'interrompt de la façon suivante :

Breaks on user-unhandled exception

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 dans 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 l'exception est désactivée, c'est-à-dire que le débogueur ne s'arrête 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'exception (par exemple, Common Language Runtime).

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

    Screenshot of Add an exception to the selected category button.

    Screenshot of Add an exception to the selected category button.

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

    Screenshot of Type exception name.

    Screenshot of Type exception name.

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

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

Conseil

Vérifiez l'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 (mais pas pour System.UriTemplateMatchException).

Les paramètres d’exception sont conservés dans le fichier .suo de la solution ; ils s’appliquent donc à une solution spécifique. Vous ne pouvez pas réutiliser des paramètres d’exception spécifiques entre plusieurs solutions. Maintenant, seules les exceptions ajoutées sont conservées ; les exceptions supprimées ne le sont pas. Vous pourriez ajouter une exception, que vous fermez la solution, puis que vous la rouvrez, l'exception sera toujours présente. Mais si vous supprimez une exception et que vous fermez/rouvrez la solution, l'exception ne s'affiche plus.

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 effectuer un arrêt sur des exceptions telles que MyNamespace.GenericException<T>, vous devez ajouter l'exception en tant que MyNamespace.GenericException'1. Autrement dit, si vous avez créé une exception telle que 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 :

Screenshot of Add generic exception.

Screenshot of Add generic exception.

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 interruptions sur des modules spécifiques.

Notes

L’ajout de conditions à une exception est pris en charge dans 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.

    Screenshot of exception conditions.

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

    Screenshot of extra conditions for an exception.

  3. Pour chaque ligne de condition, tapez le nom du module, puis remplacez la liste des opérateurs de comparaison par Égal ou Non égal. 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.