Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

По умолчанию значением свойства

HelpLink
является пустая строка. Обновите исключение с использованием инициализации объектов, чтобы предоставить более интересное значение. Ниже показан модифицированный код метода
Car.Accelerate
:

public void Accelerate(int delta)

{

if (_carIsDead)

{

Console.WriteLine("{0} is out of order...", PetName);

}

else

{

CurrentSpeed += delta;

if (CurrentSpeed >= MaxSpeed)

{

CurrentSpeed = 0;

_carIsDead = true;

//
Использовать ключевое слово throw для генерации
.

// исключения и возврата в вызывающий код

throw new Exception($"{PetName} has overheated!")

{

HelpLink = "http://www.CarsRUs.com"

};

}

Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);

}

}

Теперь можно обновить логику в блоке

catch
для вывода на консоль информации из свойства
HelpLink
:

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
, разработчики все равно обычно строят строго типизированные классы исключений, которые поддерживают специальные данные, применяя строго типизированные свойства.

Поделиться с друзьями: