Свойство Data
Свойство Data
Свойство Data объекта System.Exception является новым в .NET 2.0 и позволяет добавить в объект исключения дополнительную информацию для пользователя (например, штамп времени или что-то другое). Свойство Data возвращает объект, реализующий интерфейс с именем IDictionary, определенный в пространстве имен System.Collection. Роль программирования интерфейсов, как и пространство имен System.Collection, рассматриваются в следующей главе. Сейчас же будет достаточно заметить, что коллекции словарей позволяют создавать множества значений, возвращаемых по значению ключа. Рассмотрите, например, следующую модификацию метода Car.Accelerate().
public void Accelerate(int delta) {
if (carIsDead) Console.WriteLine("{0} не работает…", petName);
else {
currSpeed += delta;
if (currSpeed ›= maxSpeed) {
carIsDead = true;
currSpeed = 0;
// Чтобы вызвать свойство HelpLink, перед оператором,
// генерирующим объект Exception, создается локальная переменная.
Exception ex = new Exception(string.Format("{0} перегрелся!", petName));
ex.HelpLink = "http://www.CarsRUs.com";
// Место для пользовательских данных с описанием ошибки.
ex.Data.Add("Дата и время", string.Format("Автомобиль сломался {0}", DateTime.Now));
ex.Data.Add("Причина", " У вас тяжелая нога");
throw ex;
} else Console.WriteLine("=› CurrSpeed = {0}", currSpeed);
}
}
Чтобы не возникло проблем при определении пар "ключ-значение", с помощью директивы using следует указать пространство имен System.Collection, поскольку в файле, содержащем класс с реализацией метода Main(), мы собираемся использовать тип DictionaryEntry.
using System.Collections;
Затем нужно обновить программную логику catch для проверки того, что значение, возвращаемое свойством Data, не равно null (значение null задается по умолчанию). После этого мы используем свойства Key и Value типа DictionaryEntry, чтобы вывести пользовательские данные на консоль.
catch (Exception e) {
…
// По умолчанию поле данных пусто, поэтому проверяем на null.
Console.WriteLine(" -› Пользовательские данные:");
if (e.Data != null) {
foreach (DictionaryEntry de in e.Data) Console.WriteLine("-› {0}; {1}", de.Key, de.Value);
}
}
С этими изменениями мы должны получить вывод, показанный на рис. 6.4.
Рис. 6.4. Получение пользовательских данных
Исходный код. Проект SimpleException размещен в подкаталоге, соответствующем главе 6.