Г. Шилдт - Полный справочник по C++ (1109478), страница 75
Текст из файла (страница 75)
Затем исклкгчитсльная ситуация перехватывается блоком свеон и обрабатывается. Уточним это описание. Код, подлежащий контролю, должен выполняться внутри блока еху. (Функции, вызываемые внутри блока сху, также могут генерировать исключительпыс ситуации.) Исключительные ситуации перехватываются оператором свес)г, который следуст непосредственно за блоком еху, в котором они возникли. Обгций вид операторов ехзг и свеон показан ниже. сху / / Тело 6лока о"у свес)г (нннг/ иргумент) ( // ?ело йюка сагой ) саесц(оггггг2 ор.умент) ( // Тело 6кока сигей ) саес)г(гнинЗ а/гг/рггеггт) ( // Тею блока сагой саее)г (тгггг)г' ареуметгй ( // ?еко /тока соней ) Размер блока сху может варьироваться. Он может содержать как несколько операторов, так и целую программу (в этом случае функция вгайпО целиком помещается в блок еху). Возникшая исключительная ситуация перехватывается соответствующим оператором саесзг, который выполняет ес обработку.
С одним блоком еху может быть связано несколько операторов свес)к Выбор правильного оператора свеон определяется типом исключитслыюи ситуации. Из нескольких варищпов выбирается оператор свеон, тип аргумента которого совпаласт с возникшеи исключительной ситуацисй (остальные варианты ипюрируются). В процессе перехвата исключительной ситуации аргументу присваивается некос значение. Аргумент может быль объектом встроенного типа либо класса. Если фрагмент не генерирует никаких исключительных ситуаций (т.е.
в блоке еху ошибки не возникают), нс выполняется ни один оператор свесЬ. Оператор е)гхозг имеет следующий вид. Сбхон искегочитекьнок ситуиянл г $ Часть П. Язык С++ Оператор виком генерирует указанную исключнтельнтю гигяуацикь Если в программе предусмотрен ес перехват, оператор енком должен выполняться либо внутри блока сху, либо внутри функции, явно или неявно вызываемой внутри блока еку. Если генерируется исключительная ситуация, для которой нс предусмотрена обработка, программа может прекратить свое выполнение. В этом случае вызываешься стандартная функция секш1паее(), кото)хя по умолчани)о вызываеь' функцию а)зокеО.
Однако, как будет покпапо ниже, программист может предусмотреть собственную обработку ошибки. Рассмотрим пример, демонстрирующий обработку исключительной ситуации. // Гростой пример обработки исключительной ситуации. Еапс1цде <вовсгеаш> цввпд пашеврасе зсб; 1пе шагп() ( соне « "Началотп"; Сгу ( // Начало блока Сгу соне <с "Внутри блока Сгу~п"; Снгои 100; // Генерируем ошибку. соне « "Этот оператор не выполняется."; саесп (апе 1) ( // Перехват ошибки.
соне « "перехват исключительной ситуации — значение равно: соцс «1 « "М" г ) соне « "Конец"; гесцгп О; Эта программа выводит на экран следую~лис строки, Начало Внутри блока Сгу Перехват исключитез|ьной ситуации — значение равно: 100 Конец Внимательно проанализируйте эту программу. Как видите, блок еку содержит три оператора. С ним связан оператор сакс)ь(впе 1), выполняющий обработку целочисленной исключительной ситуации.
Внутри блока ску выполняются только лва из трех операторов: первый оператор сове и оператор снком. При генерации исключительной ситуации управление передастся оператору свеон, а выполнение блока еку прекращается Иначе говоря, блок свеон не вызивлеглгя. Просто программа переходит к его выполнению. (Для этого стек программы автоматически обновляется.) Таким образом, оператор сове, следующий за оператором енвом, никогда не выполняется. Обычно оператор свеон пытается исправить ошибку„предпринимая соответствующие действия. Если это возможно, выполнение программы возобновляется с оператора, следующего за блоком свеон. Однако часто ошибку исправить невозможно, и блок саво)г прекращает выполнение программы, вызывая функцию евхе ( ) или а)шке [) .
Как указывалось ранее, тип исключительной ситуации должен совпадать с типом, указанным в операторе сакс)ь Например, сели в предылушей программе изменить тип аргумента оператора свеон на лов)>1е, перехват исключительной ситуации не состоится, и программа завершится аварийно. Проиллюстрируем это следующим примером. ! // Эта программа не работает. $1пс1цбе <лов "геаш> Глава 19.
Обработка иеключвтельнык ситуаций цвз(пс пашеврасе вебз зпс шаз.п() ( соззе « "Начаззо1п" з Гсу ( // Начало блока Сту. соцс « "Внутри блока сху1п"з С)зтоы 100з // Генерируем ошибку. соне « "Этот оператор не выполняется"; ) сасс)з (бои)зте 1) ( // Не перехватывает целочисленные // исключительные ситуации. соне « "Перехват исключительной ситуации — значение равно: соцс « з.
« "1п"з соцс « "Конец"; хесцтп 0; ) В этой программе оператор саес)з(аоцтз1е и) не перехватывает целочисленные исключительные ситуации. (Разумеется, точное содержание сообщения, описывающего аварийное завершение программы, зависит от компилятора.) На экран выводятся следующие сообщения. | Начало Внутри блока г гу АЬпопаа1 рходташ сетшапасьоп Исключение может генерироваться вне блока ету только в том случае, если опо генерируется функцией, которая вызывается внутри этого блока. Рассмотрим пример. /* Генерирование исключительной ситуации внутри функции, находящейся вне блока Еху. */ $1пс1цде <ьовг ееаш> цвзпп патеврасе вег)з чово Хееве(ьпе Севс) санс « "Внутри функции хсевс, севе =: " « севе « "1п"з 1Г(Севе) овсом Севе/ зпс щаап() ( соса « "Началотп"з Сту ( // Качало блока Сту. соцс « "Внутри блока Сту1п"з Хееве(О)з Хсеве(1)з Хееве(2)з сассп (ьпс з) ( // Перехват ошибки.
соне « "Перехват исключительной ситуации — значение равно: соцс «1 « "1п" з Часть П. Язык С++ саит « "Конец'; ! тедитл 0; ) Эта программа выводит на экран следующие строки. Начала Внутри блока Сту Внутри Функции хсеес, секс = 0 Внутри Функции хсевс, сеет = 1 Перехват исключительной ситуации — значение равно". 1 Конец Блок сту может находиться внутри функции. В этом случае при каждом входе в функцию обработка исключительной ситуации выполняется заново, В качестве примера проанализируем следующую программу. айлс1ибе <таэттеаю> иэьлд паюезрасе зсб; // Блохи Стутсадсн находятся внутри Функции. иатб Хлалдтет(ьлт Сезд) ( с ту ( 11(севс) снтаи севс," сасси(тпс 1) ( саид « "Перехват исключительной ситуации $: " « 1 « '~п'; йлс тайп() ( саид « 'Начала1л"! И!ап61ет(1); ХЬагкПет(2)! Хналб1ет(0)! И!алб1ет(3)! саит « "Конец"; теситл 0; ) Эта программа выводит на экран слслующис сообщения.
Начала Перехват исключительной ситуации К: 1 Перехват исключительной ситуации $: 2 Перехват исключительной ситуаиии М. 3 Конец Как вилим, в ходе выполнения программы были перехвачены три исключительные ситуации. После каждой обработки функция возвращает управление вызывающему модулю. При повторном вызове функции обработка исключительной ситуации выполняется вновь.
Важно четко понимать, что кол, связанный с оператором свесь, выполняется только при перехвате исключительной ситуации. В противном случае оператор саван просто игнорируется. (Иначе говоря, поток управления никогда нс проходит через тс- Глава 19. Обработка исключительных ситуаций ло оператора свесь.) Например, в следуюшей пргнрамме исключитсльныс ситуации вообшс нс генерируются, и оператор саес)з нс выполняется Й В)пс1цбе <1овсгеаш> д чн(пв патеврасе яес(; Ф )з( з.пг.
шазл() соцс « "Начало1п"; Сту ( // Начало бл соне « "Внутри соззе « "Все еше ока сху. блока сху1п"; внутри блока Сху1п"з сассЬ (зпс з) ( // Перехват ошибки соне « "Перехват исключительной ситуации — значение равно: соцс «з « "тп" з ) соне « "Конец"; геспсп Оз ) Эта программа выводит на экран слсдуюшис сообшсния. начало Внутри блока Сху Все еше внутри блока Сту Конец Как видим, поток управления обошел опера~ор свесь стороной. Перехват классов исключительных ситуаций // Перехват класса исключительных ситуаций.
$1пс1цг)е <1оясгеаш> $1пс1цс(е <сяехупр> ця)пд пашеврасе ясг)з с1авв Мувхсере1оп рцЫз.с з с)зат яск шиве[80)з з.пс исае; муехсерсзоп() ( *ясх и)зас = Оз ииас = Оз ) муехсерсьоп[спат *я, ъпс е) всхсру(век и?зас, я)з н)зас = е; ) Часть И. Язык Е++ Исключительная ситуация может иметь любои тип, в том числе быть объектом класса, определенного пользователем.
В практических приложениях исключительные ситуации, определенные пользователем, встречаются чаше, чем встроенные. Возможно, это происходит потому, что программисты стремятся как можно точнее определять классы исключительных ситуаций и создавать объекты, описывающие вероятные ошибки Эта информация позволяет обработчику исправлять возникшие ошибки. Проиллюстрируем сказанное следуюшим примером. зпс взвыл() ( '.пс з.з сгу ( сочс « "Введите положительное числоз с1п » ВГ(1<0) С)зхон Муихсереьоп("Число не положительно", 1)з саес)з (Муихсереьоп е) ( уу Перехьат ошибки соцс « е.вгх к)зас « соцс « е.и)зас « "зп"з ) хесисп оз ) В результате на экране появятся следующие строки. Введите положительное число: -4 Число не положительно: -4 Программа предлагает пользователю ввести положзпсльнос число.
Если в отвст пользователь введет отрицательное число, создается объект класса мужнсерехоп, описывающий возникшую ошибку. Таким образом, класс мужхсереьоп инкапсулирует информацию об ошибке. Затем эта информация используется для обработки шянбки. Как правило, инкапсуляция информации об ошибке в отдельном классе повышает эффективность обработки исключительных ситуаций. Применение нескольких операторов са1сЬ Как известно, с одним оператором еху можно связывать несколько операторов свес)з. Именно такой вариант используется чаше всего. Однако кажлый оператор свес)з должен перехватывать отдельный тип исключитслыюи ситуации.
Например, слепу(ошах программа перехватывает целые числа и строки. $1пс1цс)е <ьовесеаю» цвьпп паюеврасе вес)з УУ Перехватываютсв несколько типов исключительньзх ситуаций. чоы хцапд1ег(ьпс севе) ( сюу ( зГ(севе) с)зхои севсз е1ве С)зтон "значение равно нулю"; ) сасс)з(ьпс 1) сосо « "Перехват исключительной ситуации Гы " « з « 'хзз' ) сасс)з(сопке с)зал *всх) ( соне « "Перехват строкиз соне « вгю « 'з,п'з ) ) ьпс юаз.п() ( Глава 19. Обработка исключительных ситуаций сове « 'НачалоМ"; Хнапй1ех(1): Хнапй1ет(2); Х)тапй1ет (О); хиапй1ех(3); соцс « "конец"; тесихп 0; ) Результаты работы атой программы приведены ниже. Начало Перехват Перехват Перехват Перехват Конец исключительной ситуации $: 1 исключительной ситуации $..
2 строки: Значение равно нулю. ысклю штельной сытуации а: 3 Как видим, каждый оператор саесЬ соответствует отдельному типу. Как правило, операторы свесь проверяются в порядке их следования в программе. Выполняется лишь тот оператор, тип аргумента которого точно соответствует возникшей искл(очительной ситуации. Все остальные блоки снеси игнориру)отся.