System.Exception.Data プロパティ

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

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

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

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

キーの競合

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

キーの競合を回避する

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

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

悪用キーの競合

処理を制御するために、1 つ以上の特別な事前に配列されたキーの存在を使用して、キーの競合を悪用します。 あるシナリオでは、呼び出し履歴階層の最上位レベルの例外ハンドラーが、下位レベルの例外ハンドラーによってスローされたすべての例外をキャッチするとします。 特殊なキーを持つキーと値のペアが存在する場合、高レベルの例外ハンドラーは、オブジェクト内IDictionaryの再メインキーと値のペアを何らかの非標準の方法で書式設定します。それ以外の場合、再メインキーと値のペアは通常の方法で書式設定されます。

次に、別のシナリオでは、呼び出し履歴階層の各レベルの例外ハンドラーが、次の下位レベルの例外ハンドラーによってスローされた例外をキャッチするとします。 さらに、各例外ハンドラーは、プロパティによって Data 返されるコレクションに、事前に配列されたキーのセットでアクセスできる一連のキーと値のペアが含まれていることを認識します。

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