Читать книги » Книги » Компьютеры и Интернет » Программирование » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 563
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

Язык программирования C#9 и платформа .NET5 - читать онлайн , автор Эндрю Троелсен

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:
которым можно обращаться внутри блока catch в вызывающем коде. Кроме того, вы можете также переопределять любые виртуальные члены, определенные в родительских классах. Например, вы могли бы реализовать CarIsDeadException, переопределив виртуальное свойство Message.

Вместо заполнения словаря данных (через свойство Data) при генерировании исключения конструктор позволяет указывать отметку времени и причину возникновения ошибки  Наконец, отметку времени и причину возникновения ошибки можно получить с применением строго типизированных свойств:

public class CarIsDeadException : ApplicationException

{

  private string _messageDetails = String.Empty;

  public DateTime ErrorTimeStamp {get; set;}

  public string CauseOfError {get; set;}

  public CarIsDeadException(){}

  public CarIsDeadException(string message,

    string cause, DateTime time)

  {

    _messageDetails = message;

    CauseOfError = cause;

    ErrorTimeStamp = time;

  }

  // Переопределить свойство Exception.Message.

  public override string Message

    => $"Car Error Message: {_messageDetails}";

}

Здесь класс CarIsDeadException поддерживает закрытое поле (_messageDetails), которое представляет данные, касающиеся текущего исключения; его можно устанавливать с использованием специального конструктора. Сгенерировать такое исключение в методе Accelerate() несложно. Понадобится просто создать, сконфигурировать и сгенерировать объект CarIsDeadException, а не System.Exception:

// Сгенерировать специальное исключение CarIsDeadException.

public void Accelerate(int delta)

{

  ...

  throw new CarIsDeadException(

    $"{PetName} has overheated!",

      "You have a lead foot", DateTime.Now)

  {

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

  };

  ...

}

Для перехвата такого входного исключения блок catch теперь можно модифицировать, чтобы в нем перехватывался конкретный тип CarIsDeadException (тем не менее, с учетом того, что System.CarIsDeadException "является" System.Exception, по-прежнему допустимо перехватывать System.Exception):

using System;

using CustomException;

Console.WriteLine("***** Fun with Custom Exceptions *****n");

Car myCar = new Car("Rusty", 90);

try

{

  // Отслеживать исключение.

  myCar.Accelerate(50);

}

catch (CarIsDeadException e)

{

  Console.WriteLine(e.Message);

  Console.WriteLine(e.ErrorTimeStamp);

  Console.WriteLine(e.CauseOfError);

}

Console.ReadLine();

Итак, теперь, когда вы понимаете базовый процесс построения специального исключения, пришло время опереться на эти знания. 

Построение специальных исключений, способ второй

В текущем классе CarIsDeadException переопределено виртуальное свойство System.Exception.Message с целью конфигурирования специального сообщения об ошибке и предоставлены два специальных свойства для учета дополнительных порций данных. Однако в реальности переопределять виртуальное свойство Message не обязательно, т.к. входное сообщение можно просто передать конструктору родительского класса:

public class CarIsDeadException : ApplicationException

{

  public DateTime ErrorTimeStamp { get; set; }

  public string CauseOfError { get; set; }

  public CarIsDeadException() { }

  // Передача сообщения конструктору родительского класса.

  public CarIsDeadException(string message, string cause, DateTime time)

    :base(message)

  {

    CauseOfError = cause;

    ErrorTimeStamp = time;

  }

}

Обратите внимание, что на этот раз не объявляется строковая переменная для представления сообщения и не переопределяется свойство Message. Взамен нужный параметр просто передается конструктору базового класса. При таком проектном решении специальный класс исключения является всего лишь уникально именованным классом, производным от System.ApplicationException (с дополнительными свойствами в случае необходимости), который не переопределяет какие-либо члены базового класса.

Не удивляйтесь, если большинство специальных классов исключений (а то и все) будет соответствовать такому простому шаблону. Во многих случаях роль специального исключения не обязательно связана с предоставлением дополнительной функциональности помимо той, что унаследована от базовых классов. На самом деле цель в том, чтобы предложить строго именованный тип, который четко идентифицирует природу ошибки, благодаря чему клиент может реализовать отличающуюся логику обработки для разных типов исключений.

Построение специальных исключений, способ третий

Если вы хотите создать по-настоящему интересный специальный класс исключения, тогда необходимо обеспечить наличие у класса следующих характеристик:

• он является производным от класса Exception/ApplicationException;

• в нем определен стандартный конструктор;

• в нем определен конструктор, который устанавливает значение унаследованного свойства Message;

• в нем определен конструктор для обработки "внутренних исключений".

Чтобы завершить исследование специальных исключений, ниже приведена последняя версия класса CarIsDeadException, в которой реализованы все упомянутые выше специальные конструкторы (свойства будут такими же, как в предыдущем примере):

public class CarIsDeadException : ApplicationException

{

  private string _messageDetails = String.Empty;

  public DateTime ErrorTimeStamp {get; set;}

  public string CauseOfError {get; set;}

  public CarIsDeadException(){}

  public CarIsDeadException(string cause, DateTime time) :

      this(cause,time,string.Empty)

  {

  }

   public CarIsDeadException(string cause, DateTime time,

                             string message) : this(cause,time,message, null)

  {

  }

    public CarIsDeadException(string cause, DateTime time,

                              string message, System.Exception inner) :

        base(message, inner)

  {

    CauseOfError = cause;

    ErrorTimeStamp = time;

  }

}

Затем необходимо модифицировать метод Accelerate() с учетом обновленного специального исключения:

throw new CarIsDeadException("You have a lead foot",

  DateTime.Now,$"{PetName} has overheated!")

{

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

};

Поскольку создаваемые специальные исключения, следующие установившейся практике в .NET Core, на самом деле отличаются только своими именами, полезно знать, что среды Visual Studio и Visual Studio Code предлагает фрагмент кода, который автоматически генерирует новый класс исключения, отвечающий рекомендациям .NET. Для его активизации наберите ехс и нажмите клавишу <ТаЬ> (в Visual Studio нажмите <Tab> два раза).

Обработка множества исключений

В своей простейшей форме блок try сопровождается единственным блоком catch. Однако в реальности часто приходится сталкиваться с ситуациями, когда операторы внутри блока try могут генерировать многочисленные исключения. Создайте новый проект консольного приложения на C# по имени ProcessMultipleExpceptions, скопируйте в него файлы Car.cs, Radio.cs и CarIsDeadException.cs из предыдущего проекта CustomException и надлежащим образом измените название пространства имен.

Затем модифицируйте метод Accelerate() класса Car так, чтобы он генерировал еще и предопределенное в библиотеках базовых классов исключение ArgumentOutOfRangeException, если передается недопустимый параметр

Перейти на страницу:
Комментарии (0)