このトピックはまだ評価されていません - このトピックを評価する

Exception.Data プロパティ

2013/12/12

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

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)
public virtual IDictionary Data { get; }

プロパティ値

型: System.Collections.IDictionary
System.Collections.IDictionary インターフェイスを実装し、ユーザー定義のキー/値ペアのコレクションを格納するオブジェクト。既定値は空のコレクションです。

Data プロパティによって返される System.Collections.IDictionary オブジェクトを使用し、例外に関する補足情報を格納および取得します。情報の形式は、任意の数のユーザー定義のキー/値ペアです。ペアの値コンポーネントが任意の型のオブジェクトであるのに対して、各キー/値ペアのキー コンポーネントは、通常、識別文字列です。

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

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

キーの競合

キーの競合は、異なる例外ハンドラーがキー/値ペアへのアクセス用に同じキーを指定した場合に発生します。キーの競合の結果として、下位レベルの例外ハンドラーが誤って上位レベルの例外ハンドラーとやり取りする可能性があります。このやりとりが軽度のプログラム エラーを招く場合があるので、アプリケーションの開発時は注意が必要です。ただし、キーの競合は、十分に注意しながら扱えばアプリケーションの拡張に利用できます。

キーの競合の回避

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

ここで、Products および Suppliers という名前の 2 つのアプリケーションがそれぞれ Sales という名前のメソッドを持っている場合を考えてみましょう。Products アプリケーション内の Sales メソッドは、製品の識別番号 (在庫管理単位つまり SKU) を提供します。Suppliers アプリケーションの Sales メソッドは、仕入先の識別番号、つまり SID を提供します。この例に名前付け規則を適用すると、"Products.Sales.SKU" および "Suppliers.Sales.SID" というキーが生成されます。

キーの競合の利用

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

ここで、別のシナリオについて考えてみましょう。コール スタック階層の各レベルの例外ハンドラーが、次に低いレベルの例外ハンドラーによってスローされた例外をキャッチするとします。各例外ハンドラーは、Data プロパティによって返されるコレクションに格納されたキー/値ペアのセットへのアクセスに事前配置キーのセットを使用できることを知っています。

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

メモメモ:

ExecutionEngineExceptionOutOfMemoryExceptionStackOverflowException、および ThreadAbortException の各クラスは、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

この情報は役に立ちましたか。
(残り 1500 文字)
フィードバックをいただき、ありがとうございました
表示:
© 2014 Microsoft. All rights reserved.