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

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

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 561
(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.

1 ... 99 100 101 102 103 ... 407 ВПЕРЕД
Перейти на страницу:
для генерации исключения, когда пользователь пытается разогнать автомобиль до скорости, которая превышает установленный предел, потребуется создать и сконфигурировать новый экземпляр класса System.Exception, установив значение доступного только для чтения свойства Message через конструктор класса. Для отправки объекта ошибки обратно вызывающему коду применяется ключевое слово throw языка С#. Ниже приведен обновленный код метода Accelerate():

// На этот раз генерировать исключение, если пользователь

// превышает предел, указанный в MaxSpeed.

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!");

    }

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

  }

}

Прежде чем выяснять, каким образом вызывающий код будет перехватывать данное исключение, необходимо отметить несколько интересных моментов. Для начала, если вы генерируете исключение, то всегда самостоятельно решаете, как вводится в действие ошибка и когда должно генерироваться исключение. Здесь мы предполагаем, что при попытке увеличить скорость объекта Car за пределы максимума должен быть сгенерирован объект System.Exception для уведомления о невозможности продолжить выполнение метода Accelerate() (в зависимости от создаваемого приложения такое предположение может быть как допустимым, так и нет).

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

Кроме того, обратите внимание, что из кода метода был удален финальный оператор else. Когда исключение генерируется (либо инфраструктурой, либо вручную с применением оператора throw), управление возвращается вызывающему методу (или блоку catch в операторе try). Это устраняет необходимость в финальном else. Оставите вы его ради лучшей читабельности или нет, зависит от ваших стандартов написания кода.

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

 ***** 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

=> CurrentSpeed = 100

Unhandled exception. System.Exception: Zippy has overheated!

   at SimpleException.Car.Accelerate(Int32 delta)

   in [путь к файлу]Car.cs:line 52

   at SimpleException.Program.Main(String[] args)

   in [путь к файлу]Program.cs:line 16

Перехват исключений

На заметку! Те, кто пришел в .NET 5 из мира Java, должны помнить о том, что члены типа не прототипируются набором исключений, которые они могут генерировать (другими словами, платформа .NET Core не поддерживает проверяемые исключения). Лучше это или хуже, но вы не обязаны обрабатывать каждое исключение, генерируемое отдельно взятым членом.

Поскольку метод Accelerate() теперь генерирует исключение, вызывающий код должен быть готов обработать его, если оно возникнет. При вызове метода, который может сгенерировать исключение, должен использоваться блок try/catch. После перехвата объекта исключения можно обращаться к различным его членам и извлекать детальную информацию о проблеме.

Дальнейшие действия с такими данными в значительной степени зависят от вас. Вы можете зафиксировать их в файле отчета, записать в журнал событий, отправить по электронной почте системному администратору или отобразить конечному пользователю сообщение о проблеме. Здесь мы просто выводим детали исключения в окно консоли:

// Обработка сгенерированного исключения.

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

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

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

myCar.CrankTunes(true);

// Разогнаться до скорости, превышающей максимальный

// предел автомобиля, с целью выдачи исключения

try

{

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

  {

    myCar. Accelerate(10);

  }

}

catch(Exception e)

{

  Console.WriteLine("n*** Error! ***");           // ошибка

  Console.WriteLine("Method: {0}", e.TargetSite);  // метод

  Console.WriteLine("Message: {0}", e.Message);    // сообщение

  Console.WriteLine("Source: {0}", e.Source);      // источник

}

// Ошибка была обработана, выполнение продолжается со следующего оператора.

Console.WriteLine("n***** Out of exception logic *****");

Console.ReadLine();

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

***** 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

=> CurrentSpeed = 100

*** Error! ***

Method: Void Accelerate(Int32)

Message: Zippy has overheated!

Source: SimpleException

***** Out of exception logic *****

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

1 ... 99 100 101 102 103 ... 407 ВПЕРЕД
Перейти на страницу:
Комментарии (0)