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

"Products" と "仕入先" という名前の2つのアプリケーションがあり、それぞれ Sales という名前のメソッドがあるとします。Suppose two applications, named Products and Suppliers, each has a method named Sales. Products アプリケーションの Sales メソッドは、製品の識別番号 (Stock Keeping Unit または SKU) を提供します。The Sales method in the Products application provides the identification number (the stock keeping unit or SKU) of a product. Supplier アプリケーションの Sales メソッドは、仕入先の id 番号 (SID) を提供します。The Sales method in the Suppliers application provides the identification number, or SID, of a supplier. そのため、この例の命名規則では、"Products. Sales. SKU" と "仕入先. Sales. SID" というキーが生成されます。Consequently, the naming convention for this example yields the keys, "Products.Sales.SKU" and "Suppliers.Sales.SID".

キーの競合の悪用Exploiting Key Conflicts

1つ以上の特殊な既定キーを使用して処理を制御することで、キーの競合を悪用します。Exploit key conflicts by using the presence of one or more special, prearranged keys to control processing. 1つのシナリオで、コールスタック階層内の最上位レベルの例外ハンドラーが、下位レベルの例外ハンドラーによってスローされたすべての例外をキャッチするとします。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.

適用対象

こちらもご覧ください