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.