Exception.Data Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene una raccolta di coppie chiave/valore che forniscono informazioni aggiuntive definite dall'utente sull'eccezione.
public:
virtual property System::Collections::IDictionary ^ Data { System::Collections::IDictionary ^ get(); };
public virtual System.Collections.IDictionary Data { get; }
member this.Data : System.Collections.IDictionary
Public Overridable ReadOnly Property Data As IDictionary
Valore della proprietà
Oggetto che implementa l'interfaccia IDictionary e contiene una raccolta di coppie chiave/valore definite dall'utente. Il valore predefinito è una raccolta vuota.
Esempio
Nell'esempio seguente viene illustrato come aggiungere e recuperare informazioni usando la Data proprietà .
// 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;
}
}
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.
// This example demonstrates the Exception.Data property.
open System
open System.Collections
let nestedRoutine2 displayDetails =
let e = Exception "This statement is the original exception message."
if displayDetails then
let s = "Information from nestedRoutine2."
let i = -903
let dt = DateTime.Now
e.Data.Add("stringInfo", s)
e.Data["IntInfo"] <- i
e.Data["DateTimeInfo"] <- dt
raise e
let nestedRoutine1 displayDetails =
try
nestedRoutine2 displayDetails
with e ->
e.Data["ExtraInfo"] <- "Information from nestedRoutine1."
e.Data.Add("MoreExtraInfo", "More information from nestedRoutine1.")
reraise ()
let runTest displayDetails =
try
nestedRoutine1 displayDetails
with e ->
printfn "An exception was thrown."
printfn $"{e.Message}"
if e.Data.Count > 0 then
printfn " Extra details:"
for de in e.Data do
let de = de :?> DictionaryEntry
printfn $""" Key: {"'" + de.Key.ToString() + "'",-20} Value: {de.Value}"""
printfn "\nException with some extra information..."
runTest false
printfn "\nException with all extra information..."
runTest true
// 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.
Imports System.Collections
Module Example
Public Sub Main()
Console.WriteLine()
Console.WriteLine("Exception with some extra information...")
RunTest(False)
Console.WriteLine()
Console.WriteLine("Exception with all extra information...")
RunTest(True)
End Sub
Public Sub RunTest(displayDetails As Boolean)
Try
NestedRoutine1(displayDetails)
Catch e As Exception
Console.WriteLine("An exception was thrown.")
Console.WriteLine(e.Message)
If e.Data.Count > 0 Then
Console.WriteLine(" Extra details:")
For Each de As DictionaryEntry In e.Data
Console.WriteLine(" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'", de.Value)
Next
End If
End Try
End Sub
Public Sub NestedRoutine1(displayDetails As Boolean)
Try
NestedRoutine2(displayDetails)
Catch e As Exception
e.Data("ExtraInfo") = "Information from NestedRoutine1."
e.Data.Add("MoreExtraInfo", "More information from NestedRoutine1.")
Throw e
End Try
End Sub
Public Sub NestedRoutine2(displayDetails As Boolean)
Dim e As New Exception("This statement is the original exception message.")
If displayDetails Then
Dim s As String = "Information from NestedRoutine2."
Dim i As Integer = -903
Dim dt As DateTime = DateTime.Now
e.Data.Add("stringInfo", s)
e.Data("IntInfo") = i
e.Data("DateTimeInfo") = dt
End If
Throw e
End Sub
End Module
' This 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.
Commenti
Utilizzare l'oggetto System.Collections.IDictionary restituito dalla Data proprietà per archiviare e recuperare informazioni supplementari rilevanti per l'eccezione. Le informazioni sono sotto forma di un numero arbitrario di coppie chiave/valore definite dall'utente. Il componente chiave di ogni coppia chiave/valore è in genere una stringa di identificazione, mentre il componente valore della coppia può essere qualsiasi tipo di oggetto.
Sicurezza della coppia chiave/valore
Le coppie chiave/valore archiviate nella raccolta restituita dalla Data proprietà non sono sicure. Se l'applicazione chiama una serie nidificata di routine e ogni routine contiene gestori di eccezioni, lo stack di chiamate risultante contiene una gerarchia di tali gestori di eccezioni. Se una routine di livello inferiore genera un'eccezione, qualsiasi gestore di eccezioni di livello superiore nella gerarchia dello stack di chiamate può leggere e/o modificare le coppie chiave/valore archiviate nella raccolta da qualsiasi altro gestore eccezioni. Ciò significa che è necessario garantire che le informazioni nelle coppie chiave/valore non siano riservate e che l'applicazione funzioni correttamente se le informazioni nelle coppie chiave/valore sono danneggiate.
Conflitti di chiave
Si verifica un conflitto di chiavi quando gestori di eccezioni diversi specificano la stessa chiave per accedere a una coppia chiave/valore. Prestare attenzione quando si sviluppa l'applicazione perché la conseguenza di un conflitto di chiavi è che i gestori di eccezioni di livello inferiore possono comunicare inavvertitamente con gestori di eccezioni di livello superiore e questa comunicazione potrebbe causare errori di programma sottili. Tuttavia, se si è cauti, è possibile usare i conflitti chiave per migliorare l'applicazione.
Evitare conflitti di chiave
Evitare conflitti di chiave adottando una convenzione di denominazione per generare chiavi univoce per coppie chiave/valore. Ad esempio, una convenzione dei nomi potrebbe produrre una chiave costituita dal nome separato da punti dell'applicazione, dal metodo che fornisce informazioni supplementari per la coppia di dati, e da un identificatore univoco.
Si supponga che due applicazioni, denominate Products e Suppliers, ognuna abbia un metodo denominato Sales. Il metodo Sales nell'applicazione Products fornisce il numero di identificazione (unità di magazzino o SKU) di un prodotto. Il metodo Sales nell'applicazione Suppliers fornisce il numero di identificazione, o SID, di un fornitore. Di conseguenza, la convenzione di denominazione per questo esempio restituisce le chiavi "Products.Sales.SKU" e "Suppliers.Sales.SID".
Sfruttare conflitti chiave
Sfrutta i conflitti di chiave usando la presenza di una o più chiavi speciali, preconfigurate per controllare l'elaborazione. Si supponga che, in uno scenario, il gestore di eccezioni di livello più alto nella gerarchia dello stack di chiamate intercetta tutte le eccezioni generate dai gestori di eccezioni di livello inferiore. Se esiste una coppia chiave/valore con una chiave speciale, il gestore eccezioni di alto livello formatta le coppie chiave/valore rimanenti nell'oggetto IDictionary in modo non standard. In caso contrario, le coppie chiave/valore rimanenti vengono formattate in modo normale.
Si supponga ora che, in un altro scenario, il gestore eccezioni a ogni livello della gerarchia dello stack di chiamate intercetta l'eccezione generata dal gestore eccezioni di livello inferiore successivo. Inoltre, ogni gestore eccezioni conosce la raccolta restituita dalla Data proprietà contiene un set di coppie chiave/valore a cui è possibile accedere con un set di chiavi prearrangato.
Ogni gestore di eccezioni usa il set prestabilito di chiavi per aggiornare il componente valore della coppia chiave/valore corrispondente con informazioni univoche a quel gestore di eccezioni. Al termine del processo di aggiornamento, il gestore eccezioni genera l'eccezione al gestore di eccezioni di livello superiore successivo. Infine, il gestore eccezioni di livello più alto accede alle coppie chiave/valore e visualizza le informazioni di aggiornamento consolidato da tutti i gestori eccezioni di livello inferiore.