Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Proprietà Exception.Data

Ottiene una collezione di coppie chiave/valore che forniscono ulteriori informazioni definite dall'utente sull'eccezione.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)
public virtual IDictionary Data { get; }

Valore proprietà

Tipo: System.Collections.IDictionary
Oggetto che implementa l'interfaccia System.Collections.IDictionary e contiene una raccolta di coppie chiave/valore definite dall'utente. Il valore predefinito è una raccolta vuota.

Utilizzare l'oggetto System.Collections.IDictionary restituito dalla proprietà Data per memorizzare e recuperare informazioni supplementari relative all'eccezione. Tali informazioni sono costituite da un numero arbitrario di coppie chiave/valore definite dall'utente. Il componente chiave di una coppia chiave/valore è in genere costituito da una stringa di identificazione, mentre il componente valore può essere costituito da un oggetto qualsiasi.

Sicurezza della coppia chiave/valore

Le coppie chiave/valore memorizzate nell'insieme restituito dalla proprietà Data non sono protette. Se l'applicazione chiama una serie annidata di routine e ogni routine contiene gestori di eccezioni, lo stack di chiamata risultante conterrà una gerarchia di tali gestori di eccezioni. Se viene generata un'eccezione da una routine di livello inferiore, il gestore di eccezioni al livello superiore della gerarchia dello stack di chiamata può leggere e/o modificare le coppie chiave/valore memorizzate nell'insieme da qualsiasi altro gestore di eccezioni. È pertanto necessario assicurare che le informazioni contenute nelle coppie chiave/valore non siano riservate e che l'applicazione funzionerà correttamente anche se le informazioni nelle coppie chiave/valore dovessero essere danneggiate.

Conflitti a livello di chiave

Si verifica un conflitto a livello di chiave quando gestori di eccezioni diversi specificano la stessa chiave di accesso a una coppia chiave/valore. È necessario prestare attenzione a questo aspetto durante lo sviluppo dell'applicazione, poiché un conflitto a livello di chiave genera una situazione in cui i gestori di eccezioni di livello inferiore possono comunicare inavvertitamente con i gestori di livello superiore, provocando errori insidiosi. Prestando la dovuta attenzione, è tuttavia possibile utilizzare i conflitti a livello di chiave per migliorare l'applicazione.

Prevenzione dei conflitti a livello di chiave

Per evitare conflitti a livello di chiave è possibile adottare una convenzione di denominazione che consenta di generare chiavi univoche per le coppie chiave/valore. Una convenzione di denominazione può ad esempio produrre una chiave costituita dal nome dell'applicazione, seguito dal metodo che fornisce le informazioni supplementari per la coppia e da un identificatore univoco, delimitati da punti.

Si considerino ad esempio due applicazioni, Prodotti e Fornitori, ognuna delle quali contiene un metodo denominato Vendite. Il metodo Vendite nell'applicazione Prodotti fornisce il numero di identificazione (Stock Keeping Unit o SKU) di un prodotto. Il metodo Vendite nell'applicazione Fornitori fornisce il numero di identificazione, o SID, di un fornitore. In questo esempio la convenzione di denominazione produrrà le chiavi "Prodotti.Vendite.SKU" e "Fornitori.Vendite.SID".

Sfruttamento dei conflitti a livello di chiave

È possibile sfruttare i conflitti di chiave approfittando della presenza di una o più chiavi speciali preordinate per controllare l'elaborazione. Si supponga che, in un determinato scenario, il gestore di eccezioni di livello più elevato nella gerarchia dello stack di chiamata rilevi tutte le eccezioni generate dai gestori di eccezioni di livello inferiore. Se esiste una coppia chiave/valore con una chiave speciale, il gestore di eccezioni di livello superiore formatta le coppie chiave/valore rimanenti nell'oggetto IDictionary secondo modalità non standard. In caso contrario, le coppie chiave/valore rimanenti vengono formattate secondo modalità normali.

A questo punto si supponga che, in un altro scenario, il gestore di eccezioni a ciascun livello della gerarchia dello stack di chiamata rilevi l'eccezione generata dal gestore di eccezioni al livello immediatamente inferiore e che ciascun gestore di eccezioni sappia che l'insieme restituito dalla proprietà Data contiene un set di coppie chiave/valore accessibile mediante un set di chiavi preordinato.

Ciascun gestore di eccezione utilizza il set di chiavi preordinato per aggiornare il componente valore della coppia chiave/valore corrispondente con informazioni univoche per tale gestore di eccezioni. Al termine del processo di aggiornamento, il gestore di eccezioni invia un'eccezione al gestore di eccezioni del livello immediatamente superiore. Il gestore di eccezioni di livello superiore accede infine alle coppie chiave/valore e visualizza le informazioni consolidate aggiornate provenienti da tutti i gestori di eccezioni dei livelli inferiori.

NotaNota

Le classi ExecutionEngineException, OutOfMemoryException, StackOverflowException e ThreadAbortException restituiscono sempre null per il valore della proprietà Data.

Nell'esempio riportato di seguito viene illustrato come aggiungere e recuperare informazioni utilizzando la proprietà 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

Supportato in: 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft. Tutti i diritti riservati.