이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
Data 속성

Exception.Data 속성

업데이트: 2007년 11월

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

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual IDictionary Data { get; }
/** @property */
public IDictionary get_Data()

public function get Data () : IDictionary

속성 값

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

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

키/값 쌍 보안

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

키 충돌

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

키 충돌 방지

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

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

키 충돌 활용

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

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

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

2wyfbc48.alert_note(ko-kr,VS.90).gif참고:

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

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

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

class Sample 
    {
    public static void Main()
        {
        Console.WriteLine();
        Console.WriteLine("Exception with some extra information...");
        RunTest(false);
        Console.WriteLine();
        Console.WriteLine("Exception 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 != null)
                {
                Console.WriteLine("  Extra details:");
                foreach (DictionaryEntry de in e.Data)
                Console.WriteLine("    The key is '{0}' and the value is: {1}", 
                                                    de.Key, 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 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.
*/


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

class Sample
{
    public static void main(String[] args)
    {
        Console.WriteLine();
        Console.WriteLine("Exception with some extra information...");
        RunTest(false);
        Console.WriteLine();
        Console.WriteLine("Exception with all extra information...");
        RunTest(true);
    } //main

    public static void RunTest(boolean displayDetails)
    {
        try {
            NestedRoutine1(displayDetails);
        }
        catch (System.Exception e) {
            Console.WriteLine("An exception was thrown.");
            Console.WriteLine(e.get_Message());
            if (e.get_Data() != null) {
                Console.WriteLine("  Extra details:");
                DictionaryEntry de; 
                IEnumerator enumObj = e.get_Data().GetEnumerator();
                while (enumObj.MoveNext()) {
                    de = (DictionaryEntry)enumObj.get_Current();
                    Console.WriteLine("    The key is '{0}' and the value " 
                        + "is: {1}", de.get_Key(), de.get_Value());
                }
            }
        }
    } //RunTest

    public static void NestedRoutine1(boolean displayDetails) 
        throws System.Exception 
    {
        try {
            NestedRoutine2(displayDetails);
        }
        catch (System.Exception e) {
            e.get_Data().set_Item("ExtraInfo",
                "Information from NestedRoutine1.");
            e.get_Data().Add("MoreExtraInfo",
                "More information from NestedRoutine1.");
            throw e;
        }
    } //NestedRoutine1

    public static void NestedRoutine2(boolean displayDetails) 
        throws System.Exception 
    {
        System.Exception e = new Exception("This statement is the original "
            + "exception message.");

        if (displayDetails) {
            String s = "Information from NestedRoutine2.";
            int i = -903;
            DateTime dt = DateTime.get_Now();
            e.get_Data().Add("stringInfo", s);
            e.get_Data().set_Item("IntInfo", (Int32)i);
            e.get_Data().set_Item("DateTimeInfo", dt);
        }
        throw e;
    } //NestedRoutine2
} //Sample
/*
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 Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0에서 지원

커뮤니티 추가 항목

추가
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft