Esporta (0) Stampa
Espandi tutto

Proprietà Exception.Data

Nota: questa proprietà è stata introdotta con .NET Framework versione 2.0.

Ottiene un insieme di coppie chiave/valore contenenti ulteriori informazioni definite dall'utente sull'eccezione.

Spazio dei nomi: System
Assembly: mscorlib (in mscorlib.dll)

public virtual IDictionary Data { get; }
/** @property */
public IDictionary get_Data ()

public function get Data () : IDictionary

Valore proprietà

Oggetto che implementa l'interfaccia System.Collections.IDictionary e contiene un insieme di coppie chiave/valore definite dall'utente. Il valore predefinito è un insieme vuoto.

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.

Protezione della coppia chiave/valore

Le coppie chiave/valore memorizzate nell'insieme restituito dalla proprietà Data non sono protette. Se l'applicazione chiama una serie nidificata 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 riferimento null (Nothing in Visual Basic) 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();
        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.
*/

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

class Sample
{
    public static void main(String[] args)
    {
        Console.WriteLine();
        Console.WriteLine("Exception with some extra information...");
        RunTest(false);
        Console.WriteLine();
        Console.WriteLine("Exception with all extra information...");
        RunTest(true);
    } //main
    
    public static void RunTest(boolean displayDetails)
    {
        try {
            NestedRoutine1(displayDetails);
        }
        catch (System.Exception e) {
            Console.WriteLine("An exception was thrown.");
            Console.WriteLine(e.get_Message());
            if (e.get_Data() != null) {
                Console.WriteLine("  Extra details:");
                DictionaryEntry de; 
                IEnumerator enumObj = e.get_Data().GetEnumerator();
                while (enumObj.MoveNext()) {
                    de = (DictionaryEntry)enumObj.get_Current();
                    Console.WriteLine("    The key is '{0}' and the value " 
                        + "is: {1}", de.get_Key(), de.get_Value());
                }
            }
        }
    } //RunTest

    public static void NestedRoutine1(boolean displayDetails) 
        throws System.Exception 
    {
        try {
            NestedRoutine2(displayDetails);
        }
        catch (System.Exception e) {
            e.get_Data().set_Item("ExtraInfo",
                "Information from NestedRoutine1.");
            e.get_Data().Add("MoreExtraInfo",
                "More information from NestedRoutine1.");
            throw e;
        }
    } //NestedRoutine1

    public static void NestedRoutine2(boolean displayDetails) 
        throws System.Exception 
    {
        System.Exception e = new Exception("This statement is the original "
            + "exception message.");

        if (displayDetails) {
            String s = "Information from NestedRoutine2.";
            int i = -903;
            DateTime dt = DateTime.get_Now();
            e.get_Data().Add("stringInfo", s);
            e.get_Data().set_Item("IntInfo", (Int32)i);
            e.get_Data().set_Item("DateTimeInfo", dt);
        }
        throw e;
    } //NestedRoutine2
} //Sample
/*
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.
*/

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile per Pocket PC, Windows Mobile per Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema.

.NET Framework

Supportato in: 2.0

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft