Exception.Data Vlastnost

Definice

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

IDictionary

Objekt, který implementuje IDictionary rozhraní a obsahuje kolekci párů klíč/hodnota definovaných uživatelem. Výchozí hodnotou je prázdná kolekce.

Příklady

Následující příklad ukazuje, jak přidat a načíst informace pomocí Data vlastnosti.

using namespace System;
using namespace System::Collections;

void NestedRunTest( bool displayDetails ); // forward declarations
void NestedRoutine1( bool displayDetails );
void NestedRoutine2( bool displayDetails );
void RunTest( bool displayDetails );

int main()
{
   Console::WriteLine("\nException with some extra information..." );
   RunTest(false);
   Console::WriteLine("\nException with all extra information..." );
   RunTest(true);
}

void RunTest( bool displayDetails )
{
   try
   {
      NestedRoutine1( displayDetails );
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "An exception was thrown." );
      Console::WriteLine( e->Message );
      if ( e->Data != nullptr )
      {
         Console::WriteLine( "  Extra details:" );

         for each (DictionaryEntry de in e->Data)
            Console::WriteLine("    Key: {0,-20}      Value: {1}", 
                               "'" + de.Key->ToString() + "'", de.Value);
      }
   }
}

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;
   }
}

void NestedRoutine2( bool displayDetails )
{
   Exception^ e = gcnew 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.
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í doplňující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 komponenty páru může být libovolný typ objektu.

Zabezpečení dvojice klíč/hodnota

Páry klíč/hodnota uložené v kolekci vrácené Data vlastností 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 je nutné zaručit, že informace v párech klíč/hodnota nejsou důvěrné a že aplikace bude fungovat správně, pokud jsou informace ve dvojicích klíč/hodnota poškozené.

Konflikty klíčů

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 páru klíč/hodnota. Při vývoji aplikace používejte upozornění, 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.

Předcházení konfliktům klíčů

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 pojmenování může přinést klíč, který se skládá z názvu aplikace s oddělovači tečky, metody, která poskytuje doplňkové informace pro dvojici a jedinečný identifikátor.

Předpokládejme, že dvě aplikace s názvem Produkty a Dodavatelé mají metodu s názvem Sales( Prodej). Metoda Sales v aplikaci Products poskytuje identifikační číslo (skladové jednotky nebo skladové položky) produktu. Metoda Prodej v aplikaci Dodavatelé poskytuje identifikační číslo nebo SID dodavatele. V důsledku toho konvence pojmenování pro tento příklad přináší klíče, "Products.Sales.SKU" a "Suppliers.Sales.SID".

Zneužití konfliktů klíčů

Zneužít konflikty klíčů pomocí přítomnosti jednoho nebo více speciálních předem uspořádaných klíčů pro ří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ě naformátuje zbývající páry klíč/hodnota v IDictionary některém nestandardním způsobem. V opačném případě se zbývající páry klíč/hodnota naformátují nějakým normální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 vyvolánou další obslužnou rutinou výjimek nižší úrovně. Kromě toho každá obslužná rutina výjimky zná kolekci vrácenou Data vlastností obsahuje sadu párů klíč/hodnota, ke kterým lze získat přístup pomocí předem uspořádané 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 párům klíč/hodnota a zobrazí konsolidované informace o aktualizaci ze všech obslužných rutin výjimek nižší úrovně.

Platí pro

Viz také