Exception.Data Exception.Data Exception.Data Exception.Data Property

定義

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。

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 インターフェイスを実装し、ユーザー定義のキー/値ペアのコレクションを格納するオブジェクト。 既定値は空のコレクションです。

次の例では、追加しを使用して情報を取得する方法、Dataプロパティ。

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プロパティを格納および例外に関連する補足情報を取得します。 情報は任意の数のユーザー定義のキー/値ペアの形式です。 各キー/値ペアのキー コンポーネントは、問題を識別する文字列では通常ペアの値のコンポーネントは任意の種類のオブジェクトであることができます。

キー/値ペアのセキュリティ

によって返されるコレクションに格納されているキー/値のペア、Dataプロパティは、安全ではありません。 アプリケーションを呼び出すと、入れ子になった一連のルーチンの各ルーチンには、例外ハンドラーが含まれている場合は、結果のコール スタックには、これらの例外ハンドラーの階層が含まれています。 低レベル ルーチンでは、例外をスローする場合、呼び出しスタックの階層内のいずれかの上位レベルの例外ハンドラーは読み取りや、他の例外ハンドラーによって、コレクションに格納されているキー/値ペアを変更します。 つまり、キー/値ペア内の情報が機密ではないと、アプリケーションが、キー/値ペア内の情報が破損している場合に、正常に動作が保証する必要があります。

キーの競合

キーの競合は、別の例外ハンドラー、キー/値のペアへのアクセスに同じキーを指定する場合に発生します。 キーの競合の結果には、下位レベルの例外ハンドラーより高度な例外ハンドラーと通信できる誤ってをこの通信プログラムの微妙なエラーが発生する可能性がありますので、アプリケーションを開発する際に、注意を使用します。 ただし、注意が必要ですが、アプリケーションを強化するためにキーの競合を使用できます。

キーの競合を避ける

キー/値ペアの一意のキーを生成する名前付け規則を採用することでキーの競合を回避します。 たとえば、名前付け規則では、アプリケーションのピリオドで区切った名前で構成されるキーのペア、および一意の識別子の補足情報を提供するメソッドを生成可能性があります。

たとえば、2 つのアプリケーションには、製品と仕入先がという名前をそれぞれ Sales という名前のメソッドがあります。 製品のアプリケーションで Sales メソッドでは、製品の識別番号 (在庫の単位または SKU の管理) を提供します。 Id 番号、または SID、サプライヤーのサプライヤー アプリケーション内の Sales メソッドを提供します。 そのため、この例の名前付け規則は、"Products.Sales.SKU"と"Suppliers.Sales.SID"キーを生成します。

キーの競合を悪用します。

キーの競合を悪用するには、1 つ以上の特殊な既定のキーの存在を使用して処理を制御します。 たとえば、1 つのシナリオでは、コール スタックの階層で最上位レベルの例外ハンドラーは、下位レベルの例外ハンドラーによってスローされたすべての例外をキャッチします。 高度な例外ハンドラーが内の残りのキー/値ペアを書式設定する特殊なキーとキー/値ペアが存在する場合、IDictionaryオブジェクトでは、残りのキー/値ペアが通常の方法で書式設定、それ以外の場合。

これでと、別のシナリオでコール スタックの階層の各レベルでの例外ハンドラーは、[次へ] の下位レベルの例外ハンドラーによってスローされた例外をキャッチします。 さらに、各例外ハンドラーがによって返されるコレクションを知っている、Dataプロパティに既定の一連のキーでアクセスできるキー/値ペアのセットが含まれています。

各例外ハンドラーでは、その例外ハンドラーに固有の情報に対応するキー/値ペアの値のコンポーネントを更新するのにキーの既定のセットを使用します。 更新プロセスが完了したら、例外ハンドラーは、次のより高度な例外ハンドラーに例外をスローします。 最後に、最上位レベルの例外ハンドラーは、キー/値ペアにアクセスし、すべての下位レベルの例外ハンドラーから統合の更新プログラムの情報を表示します。

適用対象

こちらもご覧ください