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.