이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Exception.Data 속성

2013-12-13

예외에 대한 사용자 정의 추가 정보를 제공하는 키/값 쌍의 컬렉션을 가져옵니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual IDictionary Data { get; }

속성 값

형식: System.Collections.IDictionary
System.Collections.IDictionary 인터페이스를 구현하며 사용자 정의 키/값 쌍의 컬렉션을 포함하는 개체입니다. 기본값은 빈 컬렉션입니다.

Data 속성에서 반환되는 System.Collections.IDictionary 개체를 사용하여 예외와 관련된 추가 정보를 저장하고 검색합니다. 이 정보는 임의의 수의 사용자 정의 키/값 쌍으로 이루어져 있습니다. 각 키/값 쌍의 키 구성 요소는 대개 식별 문자열이지만 키/값 쌍의 값 구성 요소는 모든 형식의 개체일 수 있습니다.

키/값 쌍 보안

Data 속성에서 반환되는 컬렉션에 저장된 키/값 쌍은 보안되지 않습니다. 응용프로그램에서 일련의 중첩 루틴을 호출하는 경우 각 루틴에 예외 처리기가 포함되어 있으면 생성되는 호출 스택에는 예외 처리기의 계층 구조가 포함됩니다. 하위 수준의 루틴에서 예외를 발생하면 호출 스택 계층 구조에 있는 상위 수준의 예외 처리기는 다른 예외 처리기에서 컬렉션에 저장한 키/값 쌍을 읽거나 수정할 수 있습니다. 따라서 키/값 쌍의 정보가 기밀이 아니고 키/값 쌍의 정보가 손상된 경우에도 응용프로그램이 제대로 작동하도록 보장해야 합니다.

키 충돌

키 충돌은 여러 예외 처리기에서 같은 키를 지정하여 키/값 쌍에 액세스하는 경우 발생합니다. 키 충돌의 결과로 하위 수준의 예외 처리기가 상위 수준의 예외 처리기와 잘못 통신할 수 있으며 이 통신으로 인해 미묘한 프로그램 오류가 발생할 수 있으므로 응용프로그램을 개발할 때 주의해야 합니다. 그러나 주의를 기울인다면 키 충돌을 사용하여 응용프로그램을 향상시킬 수 있습니다.

키 충돌 방지

키/값 쌍에 대한 고유 키를 생성하는 명명 규칙을 채택하여 키 충돌을 방지합니다. 예를 들어, 명명 규칙에서 마침표로 분리된 응용프로그램 이름, 키/값 쌍에 대한 추가 정보를 제공하는 메서드 및 고유 식별자로 구성된 키를 생성할 수 있습니다.

예를 들어, Products와 Suppliers라는 두 응용프로그램에는 각각 Sales라는 메서드가 있습니다. Products 응용프로그램의 Sales 메서드는 제품의 ID 번호(SKU(Stock Keeping Unit))를 제공하고, Suppliers 응용프로그램의 Sales 메서드는 공급자의 ID 번호(SID)를 제공합니다. 따라서 이 예제의 명명 규칙에서는 "Products.Sales.SKU"와 "Suppliers.Sales.SID"라는 키를 생성합니다.

키 충돌 활용

처리를 제어할 하나 이상의 미리 조정된 특수 키가 있다는 사실을 이용하여 키 충돌을 활용합니다. 예를 들어, 한 시나리오에서는 호출 스택 계층 구조에서 최상위 수준의 예외 처리기가 하위 수준의 예외 처리기에서 발생한 예외를 모두 처리합니다. 특수 키가 포함된 키/값 쌍이 있으면 최상위 수준의 예외 처리기는 표준이 아닌 방식으로 IDictionary 개체에서 나머지 키/값 쌍의 형식을 지정합니다. 특수 키가 포함된 키/값 쌍이 없으면 나머지 키/값 쌍의 형식이 표준 방식으로 지정됩니다.

다른 시나리오에서는 호출 스택 계층 구조의 각 수준에 있는 예외 처리기가 다음 하위 수준의 예외 처리기에서 발생한 예외를 처리합니다. 또한 각 예외 처리기는 Data 속성에서 반환된 컬렉션에 미리 조정된 키 집합을 사용하여 액세스할 수 있는 키/값 쌍 집합이 포함되어 있음을 인식하고 있습니다.

각 예외 처리기는 미리 조정된 키 집합을 사용하여 해당하는 키/값 쌍의 값 구성 요소를 해당 예외 처리기에 고유한 정보로 업데이트합니다. 업데이트 프로세스가 완료된 후 예외 처리기는 다음 상위 수준 예외 처리기에 예외를 발생합니다. 마지막으로 최상위 수준의 예외 처리기가 키/값 쌍에 액세스하여 모든 하위 수준 예외 처리기의 업데이트 정보를 통합한 정보를 표시합니다.

참고참고:

ExecutionEngineException, OutOfMemoryException, StackOverflowExceptionThreadAbortException 클래스는 Data 속성의 값에 대해 항상 null을 반환합니다.

다음 예제에서는 Data 속성을 사용하여 정보를 추가하고 검색하는 방법을 보여 줍니다.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


// This example demonstrates the Exception.Data property.
using System;
using System.Collections;

class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      outputBlock.Text += "\n";
      outputBlock.Text += "Exception with some extra information..." + "\n";
      RunTest(outputBlock, false);
      outputBlock.Text += "\n";
      outputBlock.Text += "Exception with all extra information..." + "\n";
      RunTest(outputBlock, true);
   }
   public static void RunTest(System.Windows.Controls.TextBlock outputBlock, bool displayDetails)
   {
      try
      {
         NestedRoutine1(displayDetails);
      }
      catch (Exception e)
      {
         outputBlock.Text += "An exception was thrown." + "\n";
         outputBlock.Text += e.Message + "\n";
         if (e.Data != null)
         {
            outputBlock.Text += "  Extra details:" + "\n";
            foreach (DictionaryEntry de in e.Data)
               outputBlock.Text += String.Format("    The key is '{0}' and the value is: {1}",
                                                   de.Key, de.Value) + "\n";
         }
      }
   }
   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 e;
      }
   }
   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;
   }
}
/*
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.
*/


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2015 Microsoft