Язык программирования 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!
Поделиться с друзьями: