и заметим, то вряд ли сможем оценить содержимое окна. Поэтому
мы проявляем военную хитрость — добавляем инструкцию Console.
ReadLine(), которая формально означает считывание введенного
пользователем текста. Но этот текст никуда не записывается и сам
по себе нас не интересует. Это лишь повод не закрывать консольное
окно.
Если пользователь не ввел команду exit, команда break в условном опера-
торе не выполняется и оператор цикла продолжает свою работу. Командой
50
Глава 1. Информация к размышлению: язык C# и даже больше
op=Char.Parse(text) выполняется попытка преобразовать значение тек-
стовой переменной в text в символьное значение. Для этого используется
статический метод Parse() класса Char. Аргументом указывается перемен-
ная text. Затем на сцену выходит еще один условный оператор. В нем про-
веряется сложное условие !(op=='+'|op=='-'|op=='*'|op=='/'). Восклица-
тельный знак ! является оператором логического отрицания. Вертикальная
черта | является оператором логического или. Двойное равенство == есть не
что иное, как логический оператор равенства. Поэтому, например, выраже-
ние op=='+' равно true, если значение переменной op равно '+', и false, если
не равно. Выражение op=='+'|op=='-' равно true, если значение переменной
op равно '+' или '' (и false во всех остальных случаях). Значение выраже-
ния op=='+'|op=='-'|op=='*'|op=='/' равно true, если переменная op равна
'+', или равна '', или равна '*', или равна '/'. Оператор логического отри-
цания ! превращает true в false и false в true. Поэтому значением выраже-
ния !(op=='+'|op=='-'|op=='*'|op=='/') будет true, только если переменная
op не равна ни одному из символьных значений '+', '', '*' или '/'. Други-
ми словами, значение выражения равно true, если мы ввели неправильный
символ операции. В этом случае благодаря условному оператору выводится
текстовое сообщение "Такая операция недопустима!" и инструкцией break завершается работа оператора цикла. Еще один способ цивилизованно вый-
ти из бесконечного циклического процесса — ввести некорректный символ
арифметической операции.
Блок try-catch предназначен, как уже отмечалась, для обработки ис-
ключительных ситуаций. Исключительная ситуация — это ошибка, которая возникает в процессе выполнения программы. В C# очень
элегантная и мощная встроенная система обработки ошибок. Ба-
зируется она как раз на конструкции try-catch. Основная идея, за-
ложенная в процедуру обработки ошибок, достаточно проста и эле-
гантна. Программный код, который может при выполнении вызвать
ошибку, заключается в блок try. После try-блока обычно следует
несколько catch-блоков. Каждый catch-блок предназначен для об-
работки ошибки определенного типа. Если в try-блоке в процессе
выполнения программы возникает ошибка, код try-блока перестает
выполняться, а вместо этого выполняется код соответствующего типу
ошибки catch-блока. В рассматриваемом примере использован всего
один catch-блок, который предназначен для обработки всех ошибок, которые могут возникнуть при выполнении программы.
Нам осталось разобрать только программный код в catch-блоке. Там всего
одна инструкция Console.WriteLine("Выполнена недопустимая команда."), которая выполняется, если при выполнении команд в блоке try возникнет
ошибка — любая. Если ошибка возникла, выполнение команд в try-блоке
Консольная программа 51
прекращается и выполняются команды в catch-блоке. После этого выпол-
няются команды, которые находятся после конструкции trycatch. Если
же при выполнении try-блока ошибки не возникают, catch-блок не выпол-
няется. С помощью такой нехитрой конструкции мы обеспечиваем более
устойчивую работу программы.
Протестируем работу программы. Для начала выделим несколько показа-
тельных ситуаций:
если вместо символа операции мы введем слово exit, работа программы
будет завершена;
если мы введем некорректный символ операции, работа программы будет
завершена;
если мы введем некорректное число, программа будет завершена.
Реализуем каждую из этих гипотетических ситуаций. На рис. 1.15 показа-
на ситуация, когда работа программы завершается вследствие ввода клю-
чевого слова exit.
Рис. 1.15. Работа программы завершена инструкцией exit На рис. 1.16 проиллюстрировано, что произойдет, если мы введем некор-