Г. Шилдт - С#4.0 Полное руководство (1160795), страница 75
Текст из файла (страница 75)
Для этой цели можно создать метод сопуеуог ( ), принимающий в качестве параметров следующие команды: "старт", "стоп", "вперед" и "назад". Вместо того чтобы передавать методу Сопуеуог () целые значения, например, 1 — в качестве 400 Часть 1. Язык С() команды "старт", 2 — в качестве команды "стоп" и так далее, что чревато ошибками, можно создать перечисление, чтобы присвоить этим значениям содержательные символические обозначения. Ниже приведен пример применения такого подхода.
Сымитировать управление лентой конвейера. оя1пд Яуягешг с1аяя Сопчеуогсопсго1 ( // Перечислить команды конвейера. роЬ1гс епош Ассгоп ( Ясагс, Бсср, Гогнагб, Кечегяе ); ров11с чо1С Сопчеуог(хссгоп сош) ( ян1гсЬ(сош) ( саяе Асг1оп.згагг: Сопяо1е.нг1сеьгпе("Запустить конвейер."); Ьгеакн саяе Ассгоп.зсор: Сопяо1е.нггоеььпе("Остановить конвейер."); Ь ге а ты саяе Ассгоп.рогнагг): ° Сопяо1е.иг1гевгпе("Переместить конвейер вперед."); Ьгеакы саяе Асггоп.йечегяе: Сопяо1е.ыгггеььпе("Переместить конвейер назад."); Ьгеа)г; с1аяя Сопчеуогоешо ( вгаггс чогб Магп() ( СопчеуогСопсго1 с = пен СопчеуогСопсго1() с.сопчеуог(сопчеуогсопсго1.йссгоп.зсаго)г с.сопчеуог(сопчеуогсопсго1.)ГСГ1оп.гогнагг))г с.сопчеуог(сопчеуогсопсго1.хссгоп.вечегяе)г с.сопчеуог(сопчеуогсопого1.иссгоп.Бсср); Вот к какому результату приводит выполнение этого кода.
Запустить конвейер. Переместить конвейер вперел. Переместить конвейер назад. Остановить конвейер. Метод Сопчеуог ( ) принимает аргумент типа ))сггоп, и поэтому ему могут быть переданы только значения, определяемые в перечислении Ассгоп. Например, ниже приведена попытка передать методу Сопче усг () значение 22.
с.сопчеуог(22); // Ошибка! Эта строка кода не будет скомпилирована, поскольку отсутствует предварительно заданное преобразование типа 1пс в перечислимый тип йссгоп. Именно это и препятствует передаче неправильных команд методу Сопчеуог () . Конечно, такое Глава 12. ИнтерФейсы, структуры н перечисления 401 преобразование можно организовать принудительно с помощью приведения типов, но это было бы преднамеренным, а не случайным или неумышленным действием. Кроме того, вероятность неумышленной передачи пользователем неправильных команд методу сапчеуог () сводится с минимуму благодаря тому, что эти команды обозначены символическими именами в перечислении. В приведенном выше примере обращает на себя внимание еще одно интересное обстоятельство: перечислимый тип используется для управления оператором энз ссгь Как упоминалось выше, перечисления относятся к целочисленным типам данных, и поэтому их вполне допустимо использовать в операторе знз ссЬ.
404 Часть Е Язык Ся исключительных ситуаций. Ведь в конечном счете для успешного программирования на СФ необходимо научиться умело пользоваться подсистемой обработки исключительных ситуаций. КлассЗув1еш.Ехсер1хоп В СФ исключения представлены в виде классов. Все классы исключений должны быть производными от встроенного в СФ класса Ехсерг1оп, являющегося частью пространства имен Б уз геш. Следовательно, все исключения являются подклассами класса Ехсерб1оп. К числу самых важных подклассов Ехсерсйоп относится класс Буз СешЕхсербйоп.
Именно от этого класса являются производными все исключения, генерируемые исполняющей системой Са (т.е. системой С1.В). Класс Бузсешехсерс1оп ничего не добавляет к классу Ехсерб1ол, а просто определяет вершину иерархии стандартных исключений. В среде гчЕТ Ргашеьчоги определено несколько встроенных исклкзчений, являющихся производными от класса БузбетЕхсерг1оп.
Например, при попытке выполнить деление на нуль генерируется исключение Р1ч1сгейузегоЕхсерсьоп. Как будет показано далее в этой главе, в СФ можно создавать собственные классы исключений, производные от класса Ехсерсьоп. Основы обработки исключительных ситуаций Обработка исключительных ситуаций в СФ организуется с помощью четырех ключевых слов: ггу, сасогь сигом и Впа11у. Они образуют взаимосвязанную подсистему, в которой применение одного из ключевых слов подразумевает применение другого.
На протяжении всей этой главы назначение и применение каждого из упомянутых выше ключевых слов будет рассмотрено во всех подробностях. Но преясде необходимо дать общее представление о роли каждого из них в обработке исключительных ситуаций. Поэтому ниже кратко описан принцип их действия. Операторы программы, которые требуется контролировать на появление исключений, заключаются в блок с ту. Если внутри блока с ту возникает исключительная ситуация, генерируется исключение. Это исключение может быть перехвачено и обработано каким-нибудь рациональным способом в коде программы с помощью оператора, обозначаемого ключевым словом сассгг.
Исключения, возникающие на уровне системы, генерируются исполняющей системой автоматически. А для генерирования исключений вручную служит ключевое слово ггг гон. Любой код, который должен быть непременно выполнен после выхода из блока Сгу, помещается в блок йпа11у. Применение пары ключевых слов ~гу и са~сЬ Основу обработки исключительных ситуаций в СФ составляет пара ключевых слов сгу и сасове. Эти ключевые слова действуют совместно и не могут быть использованы порознь. Ниже приведена общая форма определения блоков сгу/оассгг для обработки исключительных ситуаций: агу ( /! Блок кода, проверяемый на наличие ошибок. ) Глава 1З.
Обработка исключительных ситуаций 405 савсб (ЕхсерТуре1 ехОЬ) ( Обработчик исключения типа ЕхсерТуре1. сагсб (ЕхсерТуре2 ехОЬ) ( Обработчик исключения типа ЕхсерТуре2. ) где Ехсер Туре — это тип возникающей исключительной ситуации. Когда исключение генерируется оператором Сгу, оно перехватывается составляющим ему пару оператором сассЬ, который затем обрабатывает это исключение. В зависимости от типа исключения выполняется и соответствующий оператор сассЛ. Так, если типы генерируемого исключения и того, что указывается в операторе сабсЬ, совпадают, то выполняется именно этот оператор, а все остальные пропускаются.
Когда исключение перехватывается, переменная исключения ехОЬ получает свое значение. На самом деле указывать переменную ехОЬ необязательно. Так, ее необязательно указывать, если обработчику исключений не требуется доступ к объекту исключения, что бывает довольно часто. Для обработки исключения достаточно и его типа. Именно поэтому во многих примерах программ, приведенных в этой главе, переменная ехОЬ опускается. Следует, однако, иметь в виду, что если исключение не генерируется, то блок оператора С ту завершается как обычно, и все его операторы сагсЬ пропускаются. Выполнение программы возобновляется с первого оператора, следующего после завершающего оператора саССЬ. Таким образом, оператор сабо)1 выполняется лишь в том случае, если генерируется исключение.
Простой пример обработки исключительной ситуации Рассмотрим простой пример, демонстрирующий отслеживание и перехватывание исключения. Как вам должно быть уже известно, попытка индексировать массив за его границами приводит к ошибке. Когда возникает подобная ошибка, система СГ.В генерирует исключение 1пг)ехоцСОТЕапдеЕхсерб1оп, которое определено как стандартное для среды .НЕТ Ргатеи ог)с. В приведенной ниже программе такое исключение генерируется намеренно и затем перехватывается.
Продемонстрировать обработку исключительной ситуации. цз1пс Яузпею; с1ааз Ехсбеюо1 ( зсабьс чоьб Маьп() ( 1пг() пцюв = лен гпп(4]1 сгу ( Сопво1е.нг1геЬ1пе(Где генерирования исключения.") Сгенерировать исключение в связи с выходом индекса за границы массива. ГОГ(1ПС 1=0; 1 < 101 Ь++) ( ппюз[1) = 1~ 406 Часть ].
Язык С№ Сопзо1е.нг1геЬ1пе ("пцвз [(О]]: (1) ", 1, пцвв [а] ) 1 Сопво1е.иггсеъгпе("Не подлежит выводу") ) сассд (1пг)ехбцГОГЕапэекхсерс1оп) ( !/ Перехватить исключение. сопзо1е.нгьсеъьпе("Индекс вышел за границы массива!" ) 1 ) Сопво1е.Хгзсешпе("После блока перехвата исключения."); При выполнении этой программы получается следующий результат. До генерирования исключения. инва[0]: 0 пцва(1]: 1 пцвз(2]: 2 пцвв(3): 3 Индекс вышел за границы массива! После блока перехвата исключения. В данном примере массив пцвв типа 1пс состоит из четырех элементов.
Но в цикле Гог предпринимается попытка проиндексировать этот массив от О до 9, что и приводит к появлению исключения 1пбехс цгОгеап9еехсергуоп, когда происходит обращение к элементу массива по индексу 4. Несмотря на всю свою краткость, приведенный выше пример наглядно демонстрирует ряд основных моментов процесса обработки исключительных ситуаций. Во-первых, код который требуется контролировать на наличие ошибок, содержится в блоке г ту. Во-вторых, когда возникает исключительная ситуация (в данном случае— при попытке проиндексировать массив пцвв за его границами в цикле Еог), в блоке ггу генерируется исключение, которое затем перехватывается в блоке сагсп.
В этот момент выполнение кода в блоке гг у завершается и управление передается блоку сассд. Это означает, что оператор саго'и не вызывается специально, а выполнение кода переходит к нему автоматически. Следовательно, оператор, содержащий метод ХгьсеЕ1пе () и следуя)щий непосредственно за циклом Еог, где происходит выход индекса за границы массива, вообще не выполняется. А в задачу обработчика исключений входит исправление ошибки, приведшей к исключительной ситуации, чтобы продолжить выполнение программы в нормальном режиме.