Exception.Data Eigenschap
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee haalt u een verzameling sleutel-waardeparen op die aanvullende door de gebruiker gedefinieerde informatie over de uitzondering bieden.
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
Waarde van eigenschap
Een object dat de interface implementeert en een verzameling door de IDictionary gebruiker gedefinieerde sleutel-/waardeparen bevat. De standaardwaarde is een lege verzameling.
Voorbeelden
In het volgende voorbeeld ziet u hoe u informatie toevoegt en ophaalt met behulp van de Data eigenschap.
// 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.
Opmerkingen
Gebruik het System.Collections.IDictionary object dat door de Data eigenschap wordt geretourneerd om aanvullende informatie op te slaan en op te halen die relevant is voor de uitzondering. De informatie heeft de vorm van een willekeurig aantal door de gebruiker gedefinieerde sleutel-/waardeparen. Het belangrijkste onderdeel van elk sleutel-/waardepaar is doorgaans een identificatietekenreeks, terwijl het waardeonderdeel van het paar elk type object kan zijn.
Beveiliging van sleutel-waardepaar
De sleutel-waardeparen die zijn opgeslagen in de verzameling die door de Data-eigenschap worden geretourneerd, zijn niet veilig. Als uw toepassing een geneste reeks routines aanroept en elke routine uitzonderingshandlers bevat, bevat de resulterende aanroepstack een hiërarchie van deze uitzonderingshandlers. Als een routine op lager niveau een uitzondering genereert, kan elke uitzonderingshandler op het hoogste niveau in de aanroepstackhiërarchie de sleutel-/waardeparen lezen en/of wijzigen die zijn opgeslagen in de verzameling door een andere uitzonderingshandler. Dit betekent dat u moet garanderen dat de informatie in de sleutel-/waardeparen niet vertrouwelijk is en dat uw toepassing correct werkt als de informatie in de sleutel-/waardeparen beschadigd is.
Belangrijke conflicten
Er treedt een sleutelconflict op wanneer verschillende uitzonderingshandlers dezelfde sleutel opgeven voor toegang tot een sleutel/waardepaar. Wees voorzichtig bij het ontwikkelen van uw toepassing omdat het gevolg van een sleutelconflict is dat uitzonderingshandlers op een lager niveau per ongeluk kunnen communiceren met uitzonderingshandlers op een hoger niveau en deze communicatie kan leiden tot subtiele programmafouten. Als u echter voorzichtig bent, kunt u belangrijke conflicten gebruiken om uw toepassing te verbeteren.
Sleutelconflicten voorkomen
Vermijd sleutelconflicten door een naamconventie te gebruiken om unieke sleutels te genereren voor sleutel-/waardeparen. Een naamconventie kan bijvoorbeeld een sleutel opleveren die bestaat uit de door perioden gescheiden naam van uw toepassing, de methode die aanvullende informatie biedt voor het paar en een unieke id.
Stel dat twee toepassingen, producten en leveranciers, elk een methode met de naam Sales hebben. De verkoopmethode in de toepassing Producten levert het identificatienummer (de voorraadeenheid of SKU) van een product. De verkoopmethode in de toepassing Leveranciers levert het identificatienummer of de SID van een leverancier. Daarom levert de naamconventie voor dit voorbeeld de sleutels 'Products.Sales.SKU' en 'Suppliers.Sales.SID' op.
Sleutelconflicten misbruiken
Misbruik van sleutelconflicten door gebruik te maken van de aanwezigheid van een of meer speciale, vooraf gerangschikte sleutels om de verwerking te beheren. Stel dat in één scenario de fouthandler op het hoogste niveau in de aanroepstackhiërarchie alle uitzonderingen opvangt die worden opgeworpen door fouthandlers op lager niveau. Als er een sleutel-/waardepaar met een speciale sleutel bestaat, worden met de uitzonderingshandler op hoog niveau de resterende sleutel-/waardeparen in het IDictionary object op een niet-standaard manier opgemaakt. Anders worden de resterende sleutel-/waardeparen op een normale manier opgemaakt.
Stel nu dat in een ander scenario de uitzonderingshandler op elk niveau van de aanroepstackhiërarchie de uitzondering onderschept die wordt gegenereerd door de volgende uitzonderingshandler op lager niveau. Bovendien weet elke uitzonderingshandler dat de verzameling die door de Data eigenschap wordt geretourneerd, een set sleutel-/waardeparen bevat die kunnen worden geopend met een vooraf gerangschikte set sleutels.
Elke uitzonderingshandler gebruikt de vooraf gerangschikte set sleutels om het waardeonderdeel van het bijbehorende sleutel-/waardepaar bij te werken met informatie die uniek is voor die uitzonderingshandler. Nadat het updateproces is voltooid, genereert de uitzonderingshandler de uitzondering naar de volgende uitzonderingshandler op een hoger niveau. Ten slotte heeft de uitzonderingshandler op het hoogste niveau toegang tot de sleutel-/waardeparen en worden de geconsolideerde updategegevens van alle uitzonderingshandlers op lager niveau weergegeven.