Exception.Data Egenskap
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Hämtar en samling nyckel/värde-par som ger ytterligare användardefinierad information om undantaget.
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
Egenskapsvärde
Ett objekt som implementerar IDictionary gränssnittet och innehåller en samling användardefinierade nyckel/värde-par. Standardvärdet är en tom samling.
Exempel
I följande exempel visas hur du lägger till och hämtar information med hjälp av Data egenskapen .
// 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.
Kommentarer
Använd objektet System.Collections.IDictionary som returneras av Data egenskapen för att lagra och hämta kompletterande information som är relevant för undantaget. Informationen är i form av ett godtyckligt antal användardefinierade nyckel/värde-par. Nyckelkomponenten för varje nyckel/värde-par är vanligtvis en identifierande sträng, medan värdekomponenten i paret kan vara vilken typ av objekt som helst.
Nyckel/värde-parsäkerhet
Nyckel/värde-paren som lagras i samlingen som returneras av Data egenskapen är inte säkra. Om ditt program anropar en kapslad serie rutiner och varje rutin innehåller undantagshanterare, innehåller den resulterande anropsstacken en hierarki med dessa undantagshanterare. Om en rutin på lägre nivå utlöser ett undantag kan alla undantagshanterare på den övre nivån i anropsstackens hierarki läsa och/eller ändra nyckel/värde-paren som lagras i samlingen av någon annan undantagshanterare. Det innebär att du måste garantera att informationen i nyckel/värde-paren inte är konfidentiell och att programmet fungerar korrekt om informationen i nyckel/värde-paren är skadad.
Nyckelkonflikter
En nyckelkonflikt uppstår när olika undantagshanterare anger samma nyckel för att få åtkomst till ett nyckel/värde-par. Var försiktig när du utvecklar ditt program eftersom konsekvensen av en nyckelkonflikt är att undantagshanterare på lägre nivå oavsiktligt kan kommunicera med undantagshanterare på högre nivå, och den här kommunikationen kan orsaka subtila programfel. Men om du är försiktig kan du använda nyckelkonflikter för att förbättra ditt program.
Undvik nyckelkonflikter
Undvik nyckelkonflikter genom att använda en namngivningskonvention för att generera unika nycklar för nyckel/värde-par. En namngivningskonvention kan till exempel ge en nyckel som består av det periodavgränsade namnet på ditt program, metoden som tillhandahåller kompletterande information för paret och en unik identifierare.
Anta att två program, med namnet Produkter och leverantörer, var och en har en metod med namnet Försäljning. Metoden Försäljning i programmet Produkter innehåller identifieringsnumret (lagerhållningsenheten eller SKU:n) för en produkt. Metoden Försäljning i leverantörsprogrammet tillhandahåller en leverantörs identifieringsnummer, eller SID. Namngivningskonventionen för det här exemplet ger därför nycklarna "Products.Sales.SKU" och "Suppliers.Sales.SID".
Utnyttja nyckelkonflikter
Utnyttja nyckelkonflikter med hjälp av förekomsten av en eller flera särskilda, fördefinierade nycklar för att styra bearbetningen. Anta att i ett scenario fångar undantagshanteraren på högsta nivå i anropsstackens hierarki alla undantag som genereras av undantagshanterare på lägre nivå. Om det finns ett nyckel/värde-par med en särskild nyckel formaterar undantagshanteraren på hög nivå de återstående nyckel-/värdeparen IDictionary i objektet på något sätt som inte är standard. Annars formateras de återstående nyckel-/värdeparen på något normalt sätt.
Anta nu att undantagshanteraren på varje nivå i anropsstackens hierarki i ett annat scenario fångar undantaget som genereras av nästa undantagshanterare på lägre nivå. Dessutom vet varje undantagshanterare att samlingen som returneras av Data egenskapen innehåller en uppsättning nyckel/värde-par som kan nås med en fördefinierad uppsättning nycklar.
Varje undantagshanterare använder den fördefinierade uppsättningen nycklar för att uppdatera värdekomponenten för motsvarande nyckel/värde-par med information som är unik för undantagshanteraren. När uppdateringsprocessen är klar genererar undantagshanteraren undantaget till nästa undantagshanterare på högre nivå. Slutligen får undantagshanteraren på högsta nivå åtkomst till nyckel/värde-paren och visar den konsoliderade uppdateringsinformationen från alla undantagshanterare på lägre nivå.