System.Exception.Data 属性
本文提供了此 API 参考文档的补充说明。
System.Collections.IDictionary使用属性返回Data的对象来存储和检索与异常相关的补充信息。 信息采用任意数量的用户定义的键/值对的形式。 每个键/值对的关键组件通常是一个标识字符串,而对的值组件可以是任何类型的对象。
键/值对安全性
属性返回的集合中存储的 Data 键/值对不安全。 如果应用程序调用嵌套的一系列例程,并且每个例程都包含异常处理程序,则生成的调用堆栈包含这些异常处理程序的层次结构。 如果较低级别的例程引发异常,调用堆栈层次结构中的任何高级异常处理程序都可以读取和/或修改任何其他异常处理程序存储在集合中的键/值对。 这意味着必须确保键/值对中的信息不机密,并且如果键/值对中的信息已损坏,应用程序将正常运行。
关键冲突
当不同的异常处理程序指定用于访问键/值对的相同键时,会发生键冲突。 开发应用程序时要小心,因为关键冲突的后果是较低级别的异常处理程序可能会无意中与较高级别的异常处理程序通信,并且此通信可能会导致细微的程序错误。 但是,如果谨慎,可以使用密钥冲突来增强应用程序。
避免密钥冲突
通过采用命名约定为键/值对生成唯一键来避免密钥冲突。 例如,命名约定可能会生成一个包含应用程序句点分隔名称的键、为对提供补充信息的方法以及唯一标识符。
假设有两个名为“产品和供应商”的应用程序,每个应用程序都有一个名为 Sales 的方法。 产品应用程序中的销售方法提供产品的标识号(库存单位或 SKU)。 供应商应用程序中的销售方法提供供应商的标识号或 SID。 因此,此示例的命名约定将生成密钥“Products.Sales.SKU”和“Suppliers.Sales.SID”。
利用密钥冲突
通过使用存在一个或多个特殊的预安排键来控制处理,从而利用密钥冲突。 假设在一种方案中,调用堆栈层次结构中的最高级别异常处理程序捕获低级别异常处理程序引发的所有异常。 如果存在具有特殊键的键/值对,则高级异常处理程序以某种非标准方式设置对象中的 IDictionary 剩余键/值对的格式;否则,其余键/值对采用某种正常格式。
现在,假设在另一种方案中,调用堆栈层次结构的每个级别的异常处理程序捕获下一个较低级别的异常处理程序引发的异常。 此外,每个异常处理程序都知道属性返回的 Data 集合包含一组键/值对,这些键/值对可通过预先排列的键集进行访问。
每个异常处理程序都使用预先排列的键集来更新相应键/值对的值组件,以及该异常处理程序特有的信息。 更新过程完成后,异常处理程序会将异常引发到下一个更高级别的异常处理程序。 最后,最高级别的异常处理程序访问键/值对,并显示来自所有较低级别异常处理程序的合并更新信息。