此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Exception.Data 属性

2013/12/13

获取一个提供用户定义的其他异常信息的键/值对的集合。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public virtual IDictionary Data { get; }

属性值

类型: System.Collections.IDictionary
一个对象,它实现 System.Collections.IDictionary 接口并包含用户定义的键/值对的集合。默认值为空集合。

使用由 Data 属性返回的 System.Collections.IDictionary 对象来存储和检索与异常相关的补充信息。信息的形式为任意数目的用户定义的键/值对。键/值对中的键通常是一个标识字符串,而键/值对中的值则可以是任何对象类型。

键/值对安全性

存储在由 Data 属性返回的集合中的键/值对是不安全的。如果应用程序调用一系列嵌套的例程,每个例程都包含异常处理程序,则产生的调用堆栈包含这些异常处理程序层次结构。如果一个较低级别的例程引发了一个异常,则调用堆栈层次结构中的所有较高级别的异常处理程序都可以通过其他任何异常处理程序读取和/或修改存储在集合中的键/值对。这意味着必须保证键/值对中没有机密信息,如果键/值对中的信息被破坏,还必须保证应用程序可以正常运行。

键冲突

如果不同的异常处理程序指定相同的键来访问键/值对,则发生键冲突。键冲突可能引起较低级别的异常处理程序与较高级别的异常处理程序进行意外通信,而这种通信可能导致难以察觉的程序错误,因此在开发应用程序时应十分谨慎。只要谨慎处理,键冲突还可以用来增强应用程序。

避免键冲突

通过采用命名约定来为键/值对生成唯一的键,可以避免键冲突。例如,命名约定可以产生一个由以句点分隔的应用程序名称、为键/值对提供补充信息的方法以及一个唯一标识符组成的键。

假设有两个应用程序,分别名为 Products 和 Suppliers,每个应用程序都有一个名为 Sales 的方法。Products 应用程序中的 Sales 方法提供某种产品的标识号(库存单元或 SKU)。Suppliers 应用程序中的 Sales 方法提供供应商的标识号(或 SID)。因此,此示例的命名约定生成键“Products.Sales.SKU”和“Suppliers.Sales.SID”。

利用键冲突

通过使用存在的一个或多个预排列的特定键来控制过程,可以对键冲突进行利用。假设一种方案,调用堆栈层次结构中的最高级别异常处理程序捕捉了由较低级别异常处理程序引发的所有异常。如果存在具有特定键的键/值对,则高级别异常处理程序以某种非标准方式格式化 IDictionary 对象中的其余键/值对;否则以某种一般方式格式化其余键/值对。

现在假设另外一种方案,调用堆栈层次结构每个级别的异常处理程序都捕捉下一级别的异常处理程序引发的异常。此外,每个异常处理程序都知道由 Data 属性返回的集合中包含可使用预排列的一组键访问的一组键/值对。

每个异常处理程序都使用这组预排列的键和该异常处理程序的唯一信息来更新相应键/值对的值。更新过程完成之后,异常处理程序即向上一级别的异常处理程序引发异常。最后,最高级别异常处理程序访问该键/值对,并显示来自所有较低级别异常处理程序的合并更新信息。

说明注意:

对于 Data 属性的值,ExecutionEngineExceptionOutOfMemoryExceptionStackOverflowExceptionThreadAbortException 类始终返回 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

Windows Phone

显示:
© 2015 Microsoft