catch(Exception e)
{
...
Console.WriteLine("Help Link: {0}", e.HelpLink);
}
Свойство Data
Свойство Data
System.Exception
позволяет заполнить объект исключения подходящей вспомогательной информацией (такой как отметка времени). Свойство Data
возвращает объект, который реализует интерфейс по имени IDictionary
, определенный в пространстве имен System.Collections
. В главе 8 исследуется роль программирования на основе интерфейсов, а также рассматривается пространство имен System.Collections
. В текущий момент важно понимать лишь то, что словарные коллекции позволяют создавать наборы значений, извлекаемых по ключу. Взгляните на очередное изменение метода Car.Accelerate()
:public void Accelerate(int delta)
{
if (_carIsDead)
{
Console.WriteLine("{0} is out of order...", PetName);
}
else
{
CurrentSpeed += delta;
if (CurrentSpeed >= MaxSpeed)
{
Console.WriteLine("{0} has overheated!", PetName);
CurrentSpeed = 0;
_carIsDead = true;
// Использовать ключевое слово throw для генерации
// исключения и возврата в вызывающий код.
throw new Exception($"{PetName} has overheated!")
{
HelpLink = "http://www.CarsRUs.com",
Data = {
{"TimeStamp",$"The car exploded at {DateTime.Now}"},
{"Cause","You have a lead foot."}
}
};
}
Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);
}
}
С целью успешного прохода по парам "ключ-значение" добавьте директиву using
System.Collections
, т.к. в файле с операторами верхнего уровня будет применяться тип DictionaryEntry
:using System.Collections;
Затем обновите логику в блоке catch
Data
, на равенство null
(т.е. стандартному значению). После этого свойства Key
и Value
типа DictionaryEntry
используются для вывода специальных данных на консоль:catch (Exception e)
{
...
Console.WriteLine("\n-> Custom Data:");
foreach (DictionaryEntry de in e.Data)
{
Console.WriteLine("-> {0}: {1}", de.Key, de.Value);
}
}
Вот как теперь выглядит финальный вывод программы:
***** Simple Exception Example *****
=> Creating a car and stepping on it!
Jamming...
=> CurrentSpeed = 30
=> CurrentSpeed = 40
=> CurrentSpeed = 50
=> CurrentSpeed = 60
=> CurrentSpeed = 70
=> CurrentSpeed = 80
=> CurrentSpeed = 90
*** Error! ***
Member name: Void Accelerate(Int32)
Class defining member: SimpleException.Car
Member type: Method
Message: Zippy has overheated!
Source: SimpleException
Stack: at SimpleException.Car.Accelerate(Int32 delta) ...
at SimpleException.Program.Main(String[] args) ...
Help Link: http://www.CarsRUs.com
-> Custom Data:
-> TimeStamp: The car exploded at 3/15/2020 16:22:59
-> Cause: You have a lead foot.
***** Out of exception logic *****
Свойство Data
Exception
. Тем не менее, каким бы полезным ни было свойство Data
, разработчики все равно обычно строят строго типизированные классы исключений, которые поддерживают специальные данные, применяя строго типизированные свойства.Такой подход позволяет вызывающему коду перехватывать конкретный тип, производный от Exception