Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source

Exception.Data, propriété

Obtient une collection de paires clé/valeur qui fournissent des informations supplémentaires définies par l'utilisateur sur l'exception.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)

public virtual IDictionary Data { get; }

Valeur de propriété

Type : System.Collections.IDictionary
Objet qui implémente l'interface System.Collections.IDictionary et contient une collection de paires clé/valeur définies par l'utilisateur. La valeur par défaut est une collection vide.

Utilisez l'objet System.Collections.IDictionary retourné par la propriété Data pour stocker et récupérer des informations supplémentaires concernant l'exception. Les informations se présentent sous la forme d'un nombre arbitraire de paires clé/valeur définies par l'utilisateur. Le composant clé de chaque paire clé/valeur est en général une chaîne d'identification, tandis que le composant valeur de la paire peut être tout type d'objet.

Sécurité des paires clé/valeur

Les paires clé/valeur stockées dans la collection retournée par la propriété Data ne sont pas sécurisées. Si votre application appelle une série imbriquée de routines et que chaque routine contient des gestionnaires d'exceptions, la pile des appels résultante contient une hiérarchie de ces gestionnaires d'exceptions. Si une routine de niveau inférieur lève une exception, tout gestionnaire d'exceptions de niveau supérieur dans la hiérarchie de la pile des appels peut lire et/ou modifier les paires clé/valeur stockées dans la collection par les autres gestionnaires d'exceptions. Cela signifie que vous devez garantir que les informations contenues dans les paires clé/valeur ne sont pas confidentielles et que votre application fonctionnera correctement si ces informations sont endommagées.

Conflits de clés

Un conflit de clés se produit lorsque des gestionnaires d'exceptions différents spécifient la même clé pour accéder à une paire clé/valeur. Procédez avec prudence lors du développement de votre application, car un conflit de clés peut permettre à des gestionnaires d'exceptions de niveaux inférieurs de communiquer par inadvertance avec des gestionnaires d'exceptions de niveaux supérieurs, et cette communication peut provoquer des erreurs subtiles de programmation. Toutefois, si vous êtes prudent, vous pouvez utiliser les conflits de clés pour améliorer votre application.

Éviter les conflits de clés

Évitez les conflits de clés en adoptant une convention d'affectation de noms pour générer des clés uniques pour les paires clé/valeur. Par exemple, une convention d'affectation de noms peut produire une clé qui se compose du nom de votre application, séparé par des virgules, de la méthode qui fournit des informations supplémentaires pour la paire et d'un identificateur unique.

Supposons deux applications, nommées Produits et Fournisseurs, qui possèdent toutes deux une méthode nommée Ventes. La méthode Ventes dans l'application Produits fournit le numéro d'identification (la cote de stockage ou CDS) d'un produit. La méthode Ventes dans l'application Fournisseurs fournit le numéro d'identification, ou SID, d'un fournisseur. Par conséquent, la convention d'affectation de noms pour cet exemple produit les clés "Produits.Ventes.CDS" et "Fournisseurs.Ventes.SID".

Exploitation des conflits de clés

Exploitez les conflits de clés en utilisant la présence d'une ou de plusieurs clés spéciales, arrangées à l'avance, pour contrôler le processus. Supposons, dans un premier scénario, que le gestionnaire d'exceptions de plus haut niveau dans la hiérarchie de la pile des appels intercepte toutes les exceptions levées par les gestionnaires d'exceptions de niveaux inférieurs. Si une paire clé/valeur avec une clé spéciale existe, le gestionnaire d'exceptions de niveau le plus élevé met en forme les paires clé/valeur restantes dans l'objet IDictionary d'une manière non standard ; sinon, les paires clé/valeur restantes sont mises en forme de façon normale.

Supposons à présent, dans un autre scénario, que le gestionnaire d'exceptions à chaque niveau de la hiérarchie de la pile des appels intercepte l'exception levée par le gestionnaire d'exceptions du niveau inférieur suivant. De plus, chaque gestionnaire d'exceptions sait que la collection retournée par la propriété Data contient un ensemble de paires clé/valeur auxquelles il est possible d'accéder à l'aide d'un ensemble de clés arrangées à l'avance.

Chaque gestionnaire d'exceptions utilise l'ensemble de clés arrangées à l'avance pour mettre à jour le composant valeur de la paire clé/valeur correspondante avec des informations spécifiques à ce gestionnaire d'exceptions. Une fois la mise à jour terminée, le gestionnaire d'exceptions lève l'exception sur le gestionnaire d'exceptions du niveau supérieur suivant. Enfin, le gestionnaire d'exceptions de plus haut niveau accède aux paires clé/valeur et affiche les informations de mise à jour consolidées de tous les gestionnaires d'exceptions des niveaux inférieurs.

RemarqueRemarque

Les classes ExecutionEngineException, OutOfMemoryException, StackOverflowException et ThreadAbortException retournent toujours null comme valeur de la propriété Data.

L'exemple suivant montre comment ajouter et récupérer des informations à l'aide de la propriété Data.


// This example demonstrates the Exception.Data property.
using System;
using System.Collections;

class Sample 
    {
    public static void Main()
        {
        Console.WriteLine();
        Console.WriteLine("Exception with some extra information...");
        RunTest(false);
        Console.WriteLine();
        Console.WriteLine("Exception with all extra information...");
        RunTest(true);
        }
    public static void RunTest(bool displayDetails)
        {
        try
            {
            NestedRoutine1(displayDetails);
            }
        catch (Exception e)
            {
            Console.WriteLine("An exception was thrown.");
            Console.WriteLine(e.Message);
            if (e.Data != null)
                {
                Console.WriteLine("  Extra details:");
                foreach (DictionaryEntry de in e.Data)
                Console.WriteLine("    The key is '{0}' and the value is: {1}", 
                                                    de.Key, de.Value);
                }
            }
        }
    public static void NestedRoutine1(bool displayDetails)
        {
        try
            {
            NestedRoutine2(displayDetails);
            }
        catch (Exception e)
            {
            e.Data["ExtraInfo"] = "Information from NestedRoutine1.";
            e.Data.Add("MoreExtraInfo", "More information from NestedRoutine1.");
            throw e;
            }
        }
    public static void NestedRoutine2(bool displayDetails)
        {
        Exception e = new Exception("This statement is the original exception message.");
        if (displayDetails)
            {
            string s = "Information from NestedRoutine2.";
            int i = -903;
            DateTime dt = DateTime.Now;
            e.Data.Add("stringInfo", s);
            e.Data["IntInfo"] = i;
            e.Data["DateTimeInfo"] = dt;
            }
        throw e;
        }
    }
/*
This example produces the following results:

Exception with some extra information...
An exception was thrown.
This statement is the original exception message.
  Extra details:
    The key is 'ExtraInfo' and the value is: Information from NestedRoutine1.
    The key is 'MoreExtraInfo' and the value is: More information from NestedRoutine1.

Exception with all extra information...
An exception was thrown.
This statement is the original exception message.
  Extra details:
    The key is 'stringInfo' and the value is: Information from NestedRoutine2.
    The key is 'IntInfo' and the value is: -903
    The key is 'DateTimeInfo' and the value is: 11/26/2002 2:12:58 PM
    The key is 'ExtraInfo' and the value is: Information from NestedRoutine1.
    The key is 'MoreExtraInfo' and the value is: More information from NestedRoutine1.
*/


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ajouts de la communauté

AJOUTER
Afficher:
© 2015 Microsoft