Модуль 3: Выражения и исключения
Обзор n Введение в управляющие операторы n Операторы выбора n Итерационные операторы n Операторы перехода n Обработка исключений n Генерирование исключений
u Обзор управляющих операторов n Объединение операторов в блоки n Типы управляющих операторов
Объединение операторов в блоки n В качестве ограничителей используйте фигурные скобки n Родительский и дочерний блоки не могут иметь переменные с одинаковыми именами n Блоки одного уровня могут иметь переменные с одинаковыми именами { // code { { } int i; . . . } { int i; . . . { int i; } . . . } }
Типы управляющих операторов Операторы выбора if, switch Итерационные операторы while, do, for и foreach Операторы перехода goto, break и continue
u Операторы выбора n Оператор if n Конструкцияif-else-if и вложенныеif-инструкции n Оператор switch
Условный операторif n Синтаксис: if ( условие ) инструкция else инструкция n Нет автоматического преобразования типа в bool: int x; . . . if (x). . . // Must be if (x != 0) in C# if (x = 0). . . // Must be if (x == 0) in C#
Конструкцияif-else-if и вложенныеif-инструкции enum Suit { Clubs, Hearts, Diamonds, Spades } Suit trumps = Suit. Hearts; if (trumps == Suit. Clubs) color = "Black"; else if (trumps == Suit. Hearts) color = "Red"; else if (trumps == Suit. Diamonds) color = "Red"; else color = "Black";
Оператор switch n Для обеспечения многонаправленноговетвления используйте инструкцию switch n Для запрета «провальной» передачи управления вниз используйте инструкцию break switch (trumps) { case Suit. Clubs : case Suit. Spades : color = "Black"; break; case Suit. Hearts : case Suit. Diamonds : color = "Red"; break; default: color = "ERROR"; break; }
Тест: Найдите ошибки if number % 2 == 0 . . . 1 if (percent < 0) || (percent > 100). . . 2 if (minute == 60); minute = 0; 3 switch (trumps) { case Suit. Clubs, Suit. Spades : color = "Black"; case Suit. Hearts, Suit. Diamonds : color = "Red"; defualt : . . . } 4
u Итерационные операторы n Цикл while n Цикл do-while n Цикл foreach
Цикл while n Выполняет инструкции на основе логического условия n Проверяет выполнение логического условия в начале цикла n Выполняет инструкции до тех пор, пока условное выражение возвращает значение ИСТИНА int i = 0; while (i < 10) { Console. Write. Line(i); i++; } 0 1 2 3 4 5 6 7 8 9
Цикл do-while n Выполняет инструкции на основе логического условия n Проверяет выполнение логического условия в конце цикла n Выполняет инструкции до тех пор, пока условное выражение возвращает значение ИСТИНА int i = 0; do { Console. Write. Line(i); i++; } while (i < 10); 0 1 2 3 4 5 6 7 8 9
Цикл for n Синтаксис обновления обновляющей переменной помещается в начале цикла for (int i = 0; i < 10; i++) { Console. Write. Line(i); } 0 1 2 3 4 5 6 7 8 9 n Область видимости переменной, объявленной внутри цикла for ограничивается этим циклом for (int i = 0; i < 10; i++) Console. Write. Line(i); // Error: i is no longer in scope n В цикле for может использоваться несколько управляющих переменных for (int i = 0, j = 0; . . . ; i++, j++)
Цикл foreach n Задайте тип и имя итерационной переменной n Выполняет инструкции для каждого элемента класса коллекции Array. List numbers = new Array. List( ); for (int i = 0; i < 10; i++ ) { numbers. Add(i); } foreach (int number in numbers) { Console. Write. Line(number); } 0 1 2 3 4 5 6 7 8 9
Тест: Найдите ошибки for (int i = 0, i < 10, i++) Console. Write. Line(i); 1 int i = 0; while (i < 10) Console. Write. Line(i); 2 for (int i = 0; i >= 10; i++) Console. Write. Line(i); 3 do. . . string line = Console. Read. Line( ); guess = int. Parse(line); while (guess != answer); 4
u Операторы перехода n Оператор goto n Операторы break и continue
Оператор goto n Выполнение управления программой передается инструкции, указанной с помощью метки n Может привести к созданию «спагетти-кода» if (number % 2 == 0) goto Even; Console. Write. Line("odd"); goto End; Even: Console. Write. Line("even"); End: ;
Операторы break и continue n Оператор break организовывает «досрочный» выход из цикла n Оператор continue организовывает «досрочный» выход из итерации int i = 0; while (true) { Console. Write. Line(i); i++; if (i < 10) continue; else break; }
Лабораторная работа 3. 1: Использование выражений
u. Обработка исключений n Зачем нужны исключения? n Класс Exception n Использованиеtry- и catch-блоков n Использование нескольких catch-инструкций
Зачем нужны исключения ? n Процедурная обработка ошибок выглядит достаточно громоздко Центральная логика программы int error. Code = 0; File. Info source = new File. Info("code. cs"); if (error. Code == -1) goto Failed; int length = (int)source. Length; if (error. Code == -2) goto Failed; char[] contents = new char[length]; if (error. Code == -3) goto Failed; // Succeeded. . . Failed: . . . Обработка ошибок
Класс Exception System. Exception Out. Of. Memory. Exception IOException Null. Reference. Exception Application. Exception
Использованиеtry- и catch-блоков n Объектно-ориентированный подход к обработке ошибок l Программные инструкции, подлежащие проверке на наличие ошибок, помещают в try-блок l Исключения обрабатываются в отдельном catchблоке try { Console. Write. Line("Enter a number"); int i = int. Parse(Console. Read. Line()); } catch (Overflow. Exception caught) { Console. Write. Line(caught); } Программная логика Обработка ошибок
Использование нескольких catch-инструкций n Каждый catch-блок перехватывает один тип исключений n Можно организовать перехват всех исключений n Нельзя перехватывать тип исключений, который является производным от типа исключений, перехваченного в предыдущем catch-блоке try { Console. Write. Line("Enter first number"); int i = int. Parse(Console. Read. Line()); Console. Write. Line("Enter second number"); int j = int. Parse(Console. Read. Line()); int k = i / j; } catch (Overflow. Exception caught) {…} catch (Divide. By. Zero. Exception caught) {…}
u. Генерирование исключений n Инструкция throw n Использование блокаfinally n Переполнения в арифметических вычислениях
Инструкция throw n Выбрасывает соответствующее исключение n Задавайте в исключениях осмысленные сообщения throw выражение ; if (minute < 1 || minute >= 60) { throw new Invalid. Time. Exception(minute + " is not a valid minute"); // !! Not reached !! }
Блок finally n Код в блоке finally исполняется всегда Monitor. Enter(x); try {. . . } finally { Monitor. Exit(x); }
Проверка на арифметическое переполнение n По умолчанию проверка на арифметическое переполнение не производится l Инструкция checked включает проверку на арифметическое переполнение checked { int number = int. Max. Value; Console. Write. Line(++number); } unchecked { int number = int. Max. Value; Console. Write. Line(++number); } Overflow. Exception Выбрасывается объект Exception. Write. Line не выполняется. Max. Value + 1 отрицательно? -2147483648
Лабораторная работа 3. 2: Использование исключений