Exception.Data Özellik

Tanım

Özel durum hakkında kullanıcı tanımlı ek bilgiler sağlayan bir anahtar/değer çifti koleksiyonu alır.

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

Özellik Değeri

IDictionary

Arabirimi uygulayan IDictionary ve kullanıcı tanımlı anahtar/değer çiftlerinden oluşan bir koleksiyon içeren bir nesne. Varsayılan değer boş bir topluluktur.

Örnekler

Aşağıdaki örnekte özelliğini kullanarak bilgi ekleme ve alma işlemleri gösterilmektedir Data .

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.

Açıklamalar

System.Collections.IDictionary Özel durumla ilgili ek bilgileri depolamak ve almak için özelliği tarafından Data döndürülen nesnesini kullanın. Bilgiler, rastgele sayıda kullanıcı tanımlı anahtar/değer çifti biçimindedir. Her anahtar/değer çiftinin anahtar bileşeni genellikle tanımlayıcı bir dizedir, çiftin değer bileşeni ise herhangi bir nesne türü olabilir.

Anahtar/Değer Çifti Güvenliği

özelliği tarafından Data döndürülen koleksiyonda depolanan anahtar/değer çiftleri güvenli değildir. Uygulamanız iç içe bir dizi yordam çağırırsa ve her yordam özel durum işleyicileri içeriyorsa, sonuçta elde edilen çağrı yığını bu özel durum işleyicilerinin hiyerarşisini içerir. Alt düzey bir yordam özel durum oluşturursa, çağrı yığını hiyerarşisindeki herhangi bir üst düzey özel durum işleyicisi, koleksiyonda depolanan anahtar/değer çiftlerini başka bir özel durum işleyicisi tarafından okuyabilir ve/veya değiştirebilir. Bu, anahtar/değer çiftlerindeki bilgilerin gizli olmadığını ve anahtar/değer çiftlerindeki bilgiler bozulursa uygulamanızın doğru şekilde çalışacağını garanti etmeniz gerektiği anlamına gelir.

Anahtar Çakışmaları

Farklı özel durum işleyicileri bir anahtar/değer çiftine erişmek için aynı anahtarı belirttiğinde anahtar çakışması oluşur. Önemli bir çakışmanın sonucu alt düzey özel durum işleyicilerinin yanlışlıkla üst düzey özel durum işleyicileriyle iletişim kurabilmesi ve bu iletişimin küçük program hatalarına neden olabilmesi olduğundan uygulamanızı geliştirirken dikkatli olun. Ancak dikkatliyseniz uygulamanızı geliştirmek için anahtar çakışmalarını kullanabilirsiniz.

Anahtar Çakışmalarını Önleme

Anahtar/değer çiftleri için benzersiz anahtarlar oluşturmak üzere bir adlandırma kuralı benimseyerek anahtar çakışmalarından kaçının. Örneğin, adlandırma kuralı uygulamanızın noktayla ayrılmış adından, çift için ek bilgiler sağlayan yöntemden ve benzersiz bir tanımlayıcıdan oluşan bir anahtar verebilir.

Products ve Suppliers adlı iki uygulamanın her birinin Sales adlı bir yöntemi olduğunu varsayalım. Ürünler uygulamasındaki Sales yöntemi, bir ürünün kimlik numarasını (stok tutma birimi veya SKU) sağlar. Sağlayıcılar uygulamasındaki Satış yöntemi, bir tedarikçinin kimlik numarasını veya SID'sini sağlar. Sonuç olarak, bu örneğin adlandırma kuralı "Products.Sales.SKU" ve "Suppliers.Sales.SID" anahtarlarını verir.

Anahtar Çakışması Açığından Yararlanma

İşlemeyi denetlemek için bir veya daha fazla özel, önceden düzenlenmiş anahtarın varlığını kullanarak anahtar çakışmalarından yararlanma. Bir senaryoda, çağrı yığını hiyerarşisindeki en üst düzey özel durum işleyicisinin alt düzey özel durum işleyicileri tarafından oluşan tüm özel durumları yakaladığını varsayalım. Özel anahtara sahip bir anahtar/değer çifti varsa, üst düzey özel durum işleyicisi nesnedeki IDictionary kalan anahtar/değer çiftlerini standart olmayan bir şekilde biçimlendirır; aksi takdirde, kalan anahtar/değer çiftleri normal bir şekilde biçimlendirilir.

Şimdi başka bir senaryoda, çağrı yığını hiyerarşisinin her düzeyindeki özel durum işleyicisinin sonraki alt düzey özel durum işleyicisi tarafından oluşan özel durumu yakaladığını düşünün. Ayrıca, her özel durum işleyicisi özelliği tarafından Data döndürülen koleksiyonun önceden düzenlenmiş bir anahtar kümesiyle erişilebilen bir anahtar/değer çiftleri kümesi içerdiğini bilir.

Her özel durum işleyicisi, ilgili anahtar/değer çiftinin değer bileşenini bu özel durum işleyicisine özgü bilgilerle güncelleştirmek için önceden düzenlenmiş anahtar kümesini kullanır. Güncelleştirme işlemi tamamlandıktan sonra, özel durum işleyicisi özel durumu bir sonraki üst düzey özel durum işleyicisine oluşturur. Son olarak, en üst düzey özel durum işleyicisi anahtar/değer çiftlerine erişir ve tüm alt düzey özel durum işleyicilerinden birleştirilmiş güncelleştirme bilgilerini görüntüler.

Şunlara uygulanır

Ayrıca bkz.