Поделиться через


Exception.Data Property

Microsoft Silverlight will reach end of support after October 2021. Learn more.

Gets a collection of key/value pairs that provide additional user-defined information about the exception.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

Syntax

'Declaration
Public Overridable ReadOnly Property Data As IDictionary
public virtual IDictionary Data { get; }

Property Value

Type: System.Collections.IDictionary
An object that implements the System.Collections.IDictionary interface and contains a collection of user-defined key/value pairs. The default is an empty collection.

Remarks

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

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.

Suppose two applications, named Products and Suppliers, each has a method named Sales. The Sales method in the Products application provides the identification number (the stock keeping unit or SKU) of a product. The Sales method in the Suppliers application provides the identification number, or SID, of a supplier. Consequently, the naming convention for this example yields the keys, "Products.Sales.SKU" and "Suppliers.Sales.SID".

Exploiting Key Conflicts

Exploit key conflicts by using the presence of one or more special, prearranged keys to control processing. Suppose, in one scenario, the highest level exception handler in the call stack hierarchy catches all exceptions thrown by lower-level exception handlers. 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. 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.

NoteNote:

The ExecutionEngineException, OutOfMemoryException, StackOverflowException and ThreadAbortException classes always return nulla null reference (Nothing in Visual Basic) for the value of the Data property.

Examples

The following example demonstrates how to add and retrieve information using the Data property.

' This example demonstrates the Exception.Data property.
Imports System.Collections

Class Example
   Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)
      outputBlock.Text &= vbCrLf
      outputBlock.Text &= "Exception with some extra information..." & vbCrLf
      RunTest(outputBlock, False)
      outputBlock.Text &= vbCrLf
      outputBlock.Text &= "Exception with all extra information..." & vbCrLf
      RunTest(outputBlock, True)
   End Sub 'Main

   Public Shared Sub RunTest(ByVal outputBlock As System.Windows.Controls.TextBlock, ByVal displayDetails As Boolean)
      Try
         NestedRoutine1(displayDetails)
      Catch e As Exception
         outputBlock.Text &= "An exception was thrown." & vbCrLf
         outputBlock.Text &= e.Message & vbCrLf
         If Not (e.Data Is Nothing) Then
            outputBlock.Text &= "  Extra details:" & vbCrLf
            Dim de As DictionaryEntry
            For Each de In e.Data
               outputBlock.Text += String.Format("    The key is '{0}' and the value is: {1}", de.Key, de.Value) & vbCrLf
            Next de
         End If
      End Try
   End Sub 'RunTest

   Public Shared Sub NestedRoutine1(ByVal 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 'NestedRoutine1

   Public Shared Sub NestedRoutine2(ByVal 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 'NestedRoutine2
End Class 'Sample
'
'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 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.
*/

Version Information

Silverlight

Supported in: 5, 4, 3

Silverlight for Windows Phone

Supported in: Windows Phone OS 7.1, Windows Phone OS 7.0

XNA Framework

Supported in: Xbox 360, Windows Phone OS 7.0

Platforms

For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.

See Also

Reference