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.

たとえば、2 つのアプリケーションには、製品と仕入先がという名前をそれぞれ Sales という名前のメソッドがあります。Suppose two applications, named Products and Suppliers, each has a method named Sales. 製品のアプリケーションで Sales メソッドでは、製品の識別番号 (在庫の単位または SKU の管理) を提供します。The Sales method in the Products application provides the identification number (the stock keeping unit or SKU) of a product. Id 番号、または SID、サプライヤーのサプライヤー アプリケーション内の Sales メソッドを提供します。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

キーの競合を悪用するには、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.

適用対象

こちらもご覧ください