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. 하위 수준 루틴에서 예외를 throw 하는 경우 호출 스택 계층 구조의 모든 상위 수준 예외 처리기 읽거나 다른 예외 처리기에서 컬렉션에 저장 된 키/값 쌍을 수정할 수 있습니다.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 메서드는 제품의 id 번호 (stock keeping unit 또는 SKU)를 제공 합니다.The Sales method in the Products application provides the identification number (the stock keeping unit or SKU) of a product. 공급 업체 응용 프로그램에서 Sales 메서드 id 번호 또는 공급자의 SID를 제공합니다.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. 가정 시나리오 중 하나를 호출 스택 계층 구조에서 가장 높은 수준의 예외 처리기는 하위 수준의 예외 처리기에서 throw 된 모든 예외를 catch 합니다.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.

이제 예를 들어, 다른 시나리오에서는 호출 스택의 계층 구조의 각 수준에서 예외 처리기를 다음 하위 수준의 예외 핸들러에 의해 throw 된 예외를 catch 합니다.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. 업데이트 프로세스를 완료 한 후 예외 처리기는 다음 더 높은 수준의 예외 처리기로 예외를 throw 합니다.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.

적용 대상

추가 정보