Exception.Data Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá kolekci párů klíč/hodnota, které poskytují další uživatelem definované informace o výjimce.
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
Hodnota vlastnosti
Objekt, který implementuje IDictionary rozhraní a obsahuje kolekci uživatelsky definovaných párů klíč/hodnota. Výchozí hodnota je prázdná kolekce.
Příklady
Následující příklad ukazuje, jak přidat a načíst informace pomocí Data vlastnosti.
// 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.
Poznámky
System.Collections.IDictionary Použijte objekt vrácený Data vlastností k uložení a načtení dodatečných informací relevantních pro výjimku. Informace jsou ve formě libovolného počtu uživatelsky definovaných párů klíč/hodnota. Klíčovou součástí každého páru klíč/hodnota je obvykle identifikační řetězec, zatímco hodnota páru může být libovolný typ objektu.
Zabezpečení páru klíč/hodnota
Páry klíčů a hodnot uložené v kolekci, kterou vrátí vlastnost Data, nejsou zabezpečené. Pokud vaše aplikace volá vnořenou řadu rutin a každá rutina obsahuje obslužné rutiny výjimek, výsledný zásobník volání obsahuje hierarchii těchto obslužných rutin výjimek. Pokud rutina nižší úrovně vyvolá výjimku, může jakákoli obslužná rutina výjimky vyšší úrovně v hierarchii zásobníku volání číst a/nebo upravovat páry klíč/hodnota uložené v kolekci jakoukoli jinou obslužnou rutinou výjimek. To znamená, že musíte zaručit, že informace ve dvojicích klíč/hodnota nejsou důvěrné a že aplikace bude fungovat správně, pokud jsou informace ve dvojicích klíč/hodnota poškozené.
Klíčové konflikty
Ke konfliktu klíče dochází v případě, že různé obslužné rutiny výjimek určují stejný klíč pro přístup ke dvojici klíč/hodnota. Při vývoji aplikace buďte opatrní, protože následkem konfliktu klíče je to, že obslužné rutiny výjimek nižší úrovně můžou neúmyslně komunikovat s obslužnými rutinami výjimek vyšší úrovně a tato komunikace může způsobit drobné chyby programu. Pokud ale budete opatrní, můžete k vylepšení aplikace použít klíčové konflikty.
Vyhněte se konfliktům kláves
Vyhněte se konfliktům klíčů tím, že přijmete konvenci pojmenování pro generování jedinečných klíčů pro páry klíč/hodnota. Například konvence vytváření názvů může přinést klíč, který se skládá z názvu aplikace, který je oddělen tečkami, metoda, která poskytuje doplňující informace pro danou dvojici, a jedinečný identifikátor.
Předpokládejme, že dvě aplikace jménem Produkty a Dodavatelé mají každá metodu jménem Sales. Metoda Prodej v aplikaci Produkty poskytuje identifikační číslo (skladové jednotky nebo skladové položky) produktu. Metoda Prodej v aplikaci Dodavatelé poskytuje identifikační číslo (SID) dodavatele. V důsledku toho konvence vytváření názvů pro tento příklad přináší klíče "Products.Sales.SKU" a "Suppliers.Sales.SID".
Využití klíčových konfliktů
Využití klíčových konfliktů za použití jednoho nebo více speciálních, předem připravených klíčů k řízení zpracování. Předpokládejme, že v jednom scénáři obslužná rutina výjimky nejvyšší úrovně v hierarchii zásobníku volání zachytí všechny výjimky vyvolané obslužnými rutinami výjimek nižší úrovně. Pokud existuje pár klíč/hodnota se speciálním klíčem, obslužná rutina výjimky vysoké úrovně formátuje zbývající páry klíč/hodnota v objektu IDictionary nějakým nestandardním způsobem. Jinak se zbývající páry klíč/hodnota naformátují běžným způsobem.
Teď předpokládejme, že obslužná rutina výjimky na každé úrovni hierarchie zásobníku volání zachytí výjimku vyvolanou další obslužnou rutinou výjimky nižší úrovně. Kromě toho každá obslužná rutina výjimky ví, že kolekce vrácená vlastností Data obsahuje sadu párů klíčů a hodnot, ke kterým lze přistupovat pomocí předem stanovené sady klíčů.
Každá obslužná rutina výjimky používá předem uspořádanou sadu klíčů k aktualizaci součásti hodnoty odpovídající dvojice klíč/hodnota s informacemi jedinečnými pro obslužnou rutinu výjimky. Po dokončení procesu aktualizace obslužná rutina výjimky vyvolá výjimku na další obslužnou rutinu výjimky vyšší úrovně. Nakonec obslužná rutina výjimky nejvyšší úrovně přistupuje ke dvojicám klíč/hodnota a zobrazí konsolidované informace o aktualizaci ze všech obslužných rutin výjimek nižší úrovně.