Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
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("\nException with some extra information...");
      RunTest(false);
      Console.WriteLine("\nException 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.Count > 0) {
            Console.WriteLine("  Extra details:");
            foreach (DictionaryEntry de in e.Data)
               Console.WriteLine("    Key: {0,-20}      Value: {1}", 
                                 "'" + de.Key.ToString() + "'", 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;
   }
}
// The example displays the following output: 
//    Exception with some extra information...
//    An exception was thrown.
//    This statement is the original exception message.
//      Extra details:                                               
//        Key: 'ExtraInfo'               Value: Information from NestedRoutine1.
//        Key: 'MoreExtraInfo'           Value: More information from NestedRoutine1.
//    
//    Exception with all extra information...
//    An exception was thrown.
//    This statement is the original exception message.
//      Extra details:
//        Key: 'stringInfo'              Value: Information from NestedRoutine2.
//        Key: 'IntInfo'                 Value: -903
//        Key: 'DateTimeInfo'            Value: 7/29/2013 10:50:13 AM
//        Key: 'ExtraInfo'               Value: Information from NestedRoutine1.
//        Key: 'MoreExtraInfo'           Value: More information from NestedRoutine1. 


.NET Framework

Pris en charge dans : 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Bibliothèque de classes portable

Pris en charge dans : Bibliothèque de classes portable

.NET pour les applications du Windows Store

Pris en charge dans : Windows 8

.NET pour les applications Windows Phone

Pris en charge dans : Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (rôle principal du serveur non pris en charge), Windows Server 2008 R2 (rôle principal du serveur pris en charge avec SP1 ou version ultérieure ; Itanium non pris en charge)

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
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2014 Microsoft