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

ЖАНРЫ

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

// Свойства

public virtual IDictionary Data { get; }

public virtual string HelpLink { get; set; }

public int HResult {get;set;}

public Exception InnerException { get; }

public virtual string Message { get; }

public virtual string Source { get; set; }

public virtual string StackTrace { get; }

public MethodBase TargetSite { get; }

}

Как

видите, многие свойства, определенные в классе
System.Exception
, по своей природе допускают только чтение. Причина в том, что стандартные значения для каждого из них обычно будут предоставляться производными типами. Например, стандартное сообщение типа
IndexOutOfRangeException
выглядит так: "Index was outside the bounds of the array" (Индекс вышел за границы массива).

В табл. 7.1 описаны наиболее важные члены класса

System.Exception
.

Простейший пример

Чтобы продемонстрировать полезность структурированной обработки исключений, мы должны создать класс, который будет генерировать исключение в надлежащих (или, можно сказать, исключительных) обстоятельствах. Создадим новый проект консольного приложения C# по имени

SimpleException
и определим в нем два класса (
Car
(автомобиль) и
Radio
(радиоприемник)), связав их между собой отношением "имеет". В классе
Radio
определен единственный метод, который отвечает за включение и выключение радиоприемника:

using System;

namespace SimpleException

{

class Radio

{

public void TurnOn(bool on)

{

Console.WriteLine(on ? "Jamming..." : "Quiet time...");

}

}

}

В дополнение к использованию класса

Radio
через включение/делегацию класс
Car
(его код показан ниже) определен так, что если пользователь превышает предопределенную максимальную скорость (заданную с помощью константного члена
MaxSpeed
), тогда двигатель выходит из строя, приводя объект
Car
в нерабочее состояние (отражается закрытой переменной-членом типа
bool
по имени
_carIsDead
).

Кроме того, класс

Car
имеет несколько свойств для представления текущей скорости и указанного пользователем "дружественного названия" автомобиля, а также различные конструкторы для установки состояния нового объекта
Car
. Ниже приведено полное определение
Car
вместе с поясняющими комментариями.

using System;

namespace SimpleException

{

class Car

{

// Константа для представления максимальной скорости.

public const int MaxSpeed = 100;

// Свойства автомобиля.

public int CurrentSpeed {get; set;} = 0;

public string PetName {get; set;} = "";

// He
вышел ли автомобиль из строя?

private bool _carIsDead;

// В автомобиле имеется радиоприемник.

private readonly Radio _theMusicBox = new Radio;

// Конструкторы.

public Car {}

public Car(string name, int speed)

{

CurrentSpeed = speed;

PetName = name;

}

public void CrankTunes(bool state)

{

// Делегировать запрос внутреннему объекту.

_theMusicBox.TurnOn(state);

}

// Проверить, не перегрелся ли автомобиль.

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;

}

else

{

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

CurrentSpeed);

}

}

}

}

}

Обновите код в файле

Program.cs
, чтобы заставить объект
Car
превышать заранее заданную максимальную скорость (установленную в
100
внутри класса
Car
):

using System;

using System.Collections;

using SimpleException;

Console.WriteLine("***** Simple Exception Example *****");

Console.WriteLine("=> Creating a car and stepping on it!");

Car myCar = new Car("Zippy", 20);

myCar.CrankTunes(true);

for (int i = 0; i < 10; i++)

{

myCar.Accelerate(10);

}

Console.ReadLine;

В результате запуска кода будет получен следующий вывод:

***** Simple Exception Example *****

=> Creating a car and stepping on it!

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