Data

Предоставляет массив пар «ключ/значение» с дополнительной информацией об исключении.

Объект System.Collections.IDictionary, возвращаемый свойством Data, используется для хранения и извлечения вспомогательных сведений, касающихся исключения. Эти сведения предоставляются клиентскому приложению при выполнении метода Exception.Data.Add(< имя ключа >, < значение ключа >), т.е. в форме произвольного количества заданных пользователем пар «ключ/значение». В каждой паре «ключ/значение» ключом обычно является идентифицирующая строка, а значением – объект любого типа.

Характеристики свойства:

  • безопасность пар «ключ/значение».

    Пары «ключ/значение», хранящиеся в коллекции, возвращаемой свойством Data, не защищены. Если приложение вызывает вложенную последовательность подпрограмм и в каждой подпрограмме содержится обработчик исключений, то в результирующем стеке вызова содержится иерархия таких обработчиков исключений. Если подпрограмма нижнего уровня порождает (генерирует) исключение, то все обработчики исключений верхнего уровня в иерархии стека вызова могут считывать и/или изменять пары «ключ/значение», сохраненные в коллекции любым другим обработчиком исключений. Поэтому необходимо обеспечить отсутствие в парах «ключ/значение» конфиденциальной информации, а также надлежащую работу приложения в случае, если данные в этих парах будут повреждены;

  • конфликты ключей.

    Конфликт ключей происходит, если в разных обработчиках исключений задан один и тот же ключ для доступа к паре «ключ-значение». При разработке приложения следует соблюдать осторожность, поскольку вследствие конфликта ключей обработчики исключений нижнего уровня могут по ошибке обмениваться данными с обработчиками исключений верхнего уровня, а такой обмен может послужить причиной неочевидных ошибок программы. Однако при осторожном подходе конфликты ключей можно использовать для расширения возможностей приложения;

  • предупреждение конфликтов ключей.

    Для предупреждения конфликтов ключей можно принять контекст именования, чтобы создавать уникальные ключи для пар «ключ/значение». Например, контекст именования может обеспечить создание ключа, состоящего из имени приложения, метода, предоставляющего вспомогательные сведения для пары «ключ/значение», и уникального идентификатора, разделенных между собой точкой.

    Предположим, есть два приложения с именами Products (Продукты) и Suppliers (Поставщики), у каждого из которых есть метод Sales (Продажи). Метод Sales в приложении Products предоставляет идентификационный номер продукта (SKU). Метод Sales в приложении Suppliers предоставляет идентификационный номер поставщика (SID). Следовательно, контекст именования в этих случаях будет выглядеть как Products.Sales.SKU и Suppliers.Sales.SID;

  • использования конфликтов ключей.

    Конфликтом ключей можно воспользоваться, применив один или несколько заданных ключей для управления обработкой исключений. Предположим, что в одном сценарии обработчик исключений самого высокого уровня в иерархии стека вызова перехватывает все исключения, генерируемые обработчиками исключений нижнего уровня. Если пара «ключ/значение» с особым ключом существует, то обработчик исключений высшего уровня форматирует остальные пары «ключ/значение» в объекте IDictionary каким-либо нестандартным образом; в противном случае оставшиеся пары «ключ/значение» форматируются неким обычным способом.

Теперь предположим, что в другом сценарии обработчики исключений на каждом уровне в иерархии стека вызова перехватывают исключения, генерируемые обработчиками исключений предыдущего, более низкого уровня. Кроме того, каждому обработчику исключений известно, что в коллекции, возвращенной свойством Data, содержится набор пар «ключ/значение», доступ к которым можно получить с помощью заданного набора ключей.

Каждый обработчик исключений использует заданный набор ключей для обновления значений в соответствующей паре «ключ/значение» уникальными для этого обработчика исключений сведениями. По завершении процесса обновления обработчик событий генерирует исключение следующему обработчику исключений верхнего уровня. Наконец обработчик исключений наивысшего уровня получает доступ к паре «ключ/значение» и отображает сводные сведения для обновления, полученные от всех обработчиков исключений более низкого уровня.

Декларация
public virtual IDictionary Data {get;};
Значение свойства

Объект, который реализует интерфейс System.Collections.IDictionary и содержит в себе коллекцию пар «ключ/значение». По умолчанию коллекция является пустой.

Исключения

Отсутствуют.

Пример
// C#
using System;
using System.Collections;

class Sample
{
  public static void Main()
  {
    Console.WriteLine();
    Console.WriteLine("Исключение с частичной дополнительной информацией");
    RunTest(false);

    Console.WriteLine();
    Console.WriteLine("Исключение с полной дополнительной информацией");
    RunTest(true);
  }
  public static void RunTest(bool displayDetails)
  {
    try
    {
      NestedRoutine1(displayDetails);
    }
    catch (Exception e)
    {
      Console.WriteLine("Исключение было сгенерировано.");
      Console.WriteLine(e.Message);
      if (e.Data != null)
      {
        Console.WriteLine("  Дополнительная информация об исключении:");
        foreach (DictionaryEntry de in e.Data)
        {
          Console.WriteLine("    Ключ '{0}' и его значение : {1}",
            de.Key, de.Value);
        }
      }
    }
  }
  public static void NestedRoutine1(bool displayDetails)
  {
    try
    {
      NestedRoutine2(displayDetails);
    }
    catch (Exception e)
    {
      e.Data["ExtraInfo"] =
        "Частичная информация от вспомогательной подпрограммы1.";
      e.Data.Add("MoreExtraInfo",
        "Полная информация от вспомогательной подпрограммы1.");
      throw e;
    }
  }
  public static void NestedRoutine2(bool displayDetails)
  {
    Exception e = new Exception("Оригинальное сообщение об исключении.");
    if (displayDetails)
    {
      string s = "Информация от вспомогательной подпрограммы2.";
      int i = -903;
      DateTime dt = DateTime.Now;
      e.Data.Add("stringInfo", s);
      e.Data["IntInfo"] = i;
      e.Data["DateTimeInfo"] = dt;
    }
    throw e;
  }
}

Результат выполнения примера:

Исключение с частичной дополнительной информацией
Исключение было сгенерировано.
Оригинальное сообщение об исключении.
Дополнительная информация об исключении:
    Ключ 'ExtraInfo' и его значение : Частичная информация от вспомогательной подпрограммы1.
    Ключ 'MoreExtraInfo' и его значение : Полная информация от вспомогательной подпрограммы1.

Исключение с полной дополнительной информацией
Исключение было сгенерировано.
Оригинальное сообщение об исключении.
  Дополнительная информация об исключении:
    Ключ 'stringInfo' и его значение : Информация от вспомогательной подпрограммы2.
    Ключ 'IntInfo' и его значение : -903
    Ключ 'DateTimeInfo' и его значение : 24.04.2013 14:44:35
    Ключ 'ExtraInfo' и его значение : Частичная информация от вспомогательной подпрограммы1.
    Ключ 'MoreExtraInfo' и его значение : Полная информация от вспомогательной подпрограммы1.