Exception.Data Exception.Data Exception.Data Exception.Data Property

Определение

Возвращает коллекцию пар "ключ-значение", предоставляющих дополнительную заданную пользователем информацию об исключении.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

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

Значение свойства

Объект, который реализует интерфейс IDictionary и содержит в себе коллекцию пар "ключ-значение".An object that implements the IDictionary interface and contains a collection of user-defined key/value pairs. По умолчанию является пустой коллекцией.The default is an empty collection.

Примеры

Приведенный ниже показано, как добавлять и извлекать сведения с помощью Data свойство.The following example demonstrates how to add and retrieve information using the Data property.

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. 
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. 

Комментарии

Используйте System.Collections.IDictionary объект, возвращаемый Data свойство для хранения и извлечения с дополнительными сведения, относящиеся к исключению.Use the System.Collections.IDictionary object returned by the Data property to store and retrieve supplementary information relevant to the exception. Эта информация содержится в виде произвольное число пар ключ/значение, определяемые пользователем.The information is in the form of an arbitrary number of user-defined key/value pairs. Ключевым компонентом каждой пары "ключ значение" обычно является строка, идентифицирующая, а компонент значения пары может быть объект любого типа.The key component of each key/value pair is typically an identifying string, whereas the value component of the pair can be any type of object.

Безопасность пар ключ значениеKey/Value Pair Security

Пары ключ/значение, хранящихся в коллекции, возвращаемой Data свойства не являются безопасными.The key/value pairs stored in the collection returned by the Data property are not secure. Если приложение вызывает вложенную последовательность подпрограмм, а каждая процедура содержит обработчики исключений, стек вызовов содержит иерархию этих обработчиков исключений.If your application calls a nested series of routines, and each routine contains exception handlers, the resulting call stack contains a hierarchy of those exception handlers. При возникновении исключения в подпрограмму более низкого уровня, все обработчики исключений верхнего уровня в иерархии стека вызова могут считывать и/или изменять пары "ключ значение", хранящихся в коллекции с любым другим обработчиком исключений.If a lower-level routine throws an exception, any upper-level exception handler in the call stack hierarchy can read and/or modify the key/value pairs stored in the collection by any other exception handler. Это означает, что вы должны гарантировать, что данные в парах "ключ значение" не является конфиденциальной и что приложение будет правильно работать в случае повреждения данные в парах "ключ значение".This means you must guarantee that the information in the key/value pairs is not confidential and that your application will operate correctly if the information in the key/value pairs is corrupted.

Конфликтов ключейKey Conflicts

Конфликт ключей происходит при разных обработчиках исключений задан один и тот же ключ для доступа к паре ключ/значение.A key conflict occurs when different exception handlers specify the same key to access a key/value pair. Будьте осторожны при разработке приложения, так как вследствие конфликта ключей обработчики исключений более низкого уровня случайно могут обмениваться данными с обработчиками исключений верхнего уровня, что это взаимодействие может привести к неочевидных ошибок программы.Use caution when developing your application because the consequence of a key conflict is that lower-level exception handlers can inadvertently communicate with higher-level exception handlers, and this communication might cause subtle program errors. Тем не менее если вы являетесь осторожность можно использовать конфликтов ключей расширить свое приложение.However, if you are cautious you can use key conflicts to enhance your application.

Предотвращение конфликтов ключейAvoiding Key Conflicts

Избегайте конфликтов ключей, интегрируя именования, чтобы создавать уникальные ключи для пар "ключ значение".Avoid key conflicts by adopting a naming convention to generate unique keys for key/value pairs. Например соглашение об именовании могут дать ключом, который состоит из имени приложения с разделителями точками, метод, который предоставляет дополнительные сведения для пары, а уникальный идентификатор.For example, a naming convention might yield a key that consists of the period-delimited name of your application, the method that provides supplementary information for the pair, and a unique identifier.

Предположим, что два приложения с именем, продуктами и поставщиками, каждый имеет метод с именем Sales.Suppose two applications, named Products and Suppliers, each has a method named Sales. Метод Sales в приложении Products предоставляет идентификационный номер (номера SKU единица или номер SKU) продукта.The Sales method in the Products application provides the identification number (the stock keeping unit or SKU) of a product. Метод Sales в приложении Suppliers предоставляет идентификационный номер или идентификатор безопасности, поставщика.The Sales method in the Suppliers application provides the identification number, or SID, of a supplier. Следовательно соглашение об именовании для этого примера дает ключей, «Products.Sales.SKU» и «Suppliers.Sales.SID».Consequently, the naming convention for this example yields the keys, "Products.Sales.SKU" and "Suppliers.Sales.SID".

Использования конфликтов ключейExploiting Key Conflicts

Воспользоваться конфликтов ключей с помощью наличие одного или нескольких специальных, применив ключей для управления обработкой.Exploit key conflicts by using the presence of one or more special, prearranged keys to control processing. Предположим, что в одном случае обработчик исключений высокого уровня в иерархии стека вызова перехватывает все исключения, создаваемые обработчиков исключений более низкого уровня.Suppose, in one scenario, the highest level exception handler in the call stack hierarchy catches all exceptions thrown by lower-level exception handlers. Если существует пару "ключ значение" назначить специальный ключ, обработчик исключений высшего уровня форматирует оставшихся пар ключ/значение в IDictionary объект либо нестандартным образом; в противном случае оставшихся пар ключ/значение форматируются в некоторых обычным способом.If a key/value pair with a special key exists, the high-level exception handler formats the remaining key/value pairs in the IDictionary object in some nonstandard way; otherwise, the remaining key/value pairs are formatted in some normal manner.

Теперь предположим, что в другом сценарии обработчик исключений на каждом уровне иерархии стека вызова перехватывает исключение, вызванное Далее обработчик исключений более низкого уровня.Now suppose, in another scenario, the exception handler at each level of the call stack hierarchy catches the exception thrown by the next lower-level exception handler. Кроме того, каждому обработчику исключений известно в коллекцию, возвращаемую Data свойство содержит набор пар "ключ значение", доступных с помощью заданного набора ключей.In addition, each exception handler knows the collection returned by the Data property contains a set of key/value pairs that can be accessed with a prearranged set of keys.

Каждый обработчик исключений использует заданный набор ключей для обновления компонента значение соответствующей пары ключ/значение сведениями, уникальными для этого обработчика исключений.Each exception handler uses the prearranged set of keys to update the value component of the corresponding key/value pair with information unique to that exception handler. После завершения процесса обновления, обработчик исключений создает исключение в обработчик исключений следующего более высокого уровня.After the update process is complete, the exception handler throws the exception to the next higher-level exception handler. Наконец обработчик исключений высокого уровня обращается к пары "ключ значение" и сведения о консолидированных обновления от всех обработчиков исключений нижнего уровня.Finally, the highest level exception handler accesses the key/value pairs and displays the consolidated update information from all the lower-level exception handlers.

Применяется к

Дополнительно