Alt linux Программирование на языке С++ в среде Qt Creator Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк, О. В. Чеснокова, А. С. Чмыхало Москва alt linux 2015



Download 5,27 Mb.
Pdf ko'rish
bet135/193
Sana24.02.2022
Hajmi5,27 Mb.
#227496
1   ...   131   132   133   134   135   136   137   138   ...   193
Bog'liq
Book-qtC


Глава 10. Объектно-ориентированное программирование
программисту инстинктивно хочется выполнять проверку корректности работы
как можно реже, что повышает вероятность неотслеживаемых сбоев в работе
создаваемого программного продукта.
Второй недостаток связан с крайней лаконичностью информации об ошибке,
передаваемой стандартными средствами. Например, по коду ошибки, возник-
шей где-то на одном из внутренних уровней вложенности, программа определяет
проблему с открытием файла, и выдаёт пользователю сообщение «файл не най-
ден». Однако если бы механизм обработки ошибок позволял программисту для
каждого типа ошибочной ситуации стандартными средствами передавать про-
извольную дополнительную информацию, было бы гораздо проще организовать
информативные сообщения в духе «не найден файл такой-то», или «не удалось
создать файл такого-то размера», или «выделение в памяти такого-то количества
байт завершилась неудачей».
Для решения этих проблем в C++ был включён новый механизм — обработка
исключительных ситуаций
.
Исключительная ситуация (англ. «exception») или исключение — это что-то
особенное или ненормальное, случившееся в работе программы. Чаще всего ис-
ключение — это какая-то возникшая ошибка, но не обязательно: например, это
может быть нестандартное стечение обстоятельств или просто ситуация, требу-
ющая нетиповой обработки.
Если в программе (или в библиотечной функции, которую использует про-
грамма) возникает какая-то неразрешимая ситуация, то генерируется исключе-
ние
. Это означает, что вместо нормального продолжения программы управление
передаётся на другую ветку алгоритма, специально предназначенную для обра-
ботки такой исключительной ситуации. Эта другая ветвь программы — обработ-
чик исключения
— может просто прервать программу, а может что-то изменить,
чтобы программа могла продолжить выполнение. Причём, даже если исключе-
ние возникает в библиотечной функции, обработчик исключения всё равно нахо-
дится в программе, использующей эту библиотеку — в той части кода, которая
непосредственно вызвала конкретную нестандартную ситуацию и потому лучше
может справиться с её обработкой.
Чтобы исключение, сгенерированное в одном блоке кода, могло найти нуж-
ный обработчик, находящийся в другом блоке, при генерации исключения выбра-
сывается индикатор исключения
. Индикатором служит объект или переменная
некоторого конкретного типа. При возникновении исключения будет выбран тот
обработчик, в описании которого указан тот же тип ожидаемого индикатора.
Обработчики различают исключения по типам данных индикатора, и поэтому
в наиболее распространённом случае в качестве индикатора указывают объект
некоторого класса, специально предусмотренного для этой цели.
Программист, желающий использовать исключения, должен поместить вы-
зов кода, в котором исключение может возникнуть, в специальный блок try{}.
Следом за этим блоком должен следовать блок catch(){}, внутрь которого по-
мещают код, обрабатывающий исключительную ситуацию. Например, если ис-
Программирование на языке С++ в среде Qt Creator


10.5. Обработка исключений
307
ключение может возникнуть в некой функции f(), для его обработки нужно
написать следующую конструкцию:
f ( )
{
//генерируем исключение, если возникла соответствующая ситуация
i f
( . . . . ) throw индикатор ;
. . . . .
}
. . . . .
try
{
//вызываем код, который может сгенерировать исключение:
f ( ) ;
}
catch ( индикатор )
{
//обрабатываем исключение
. . . . .
}
Обработчик исключения всегда следует сразу за блоком try{}. В круглых
скобках после catch указывается индикатор исключения, которое этот блок обра-
батывает. Чтобы сгенерировать исключение, нужно использовать специальную
конструкцию throw, после которой указывается индикатор.
В следующем примере, показывающем, как можно применить обработ-
ку исключений для организации диалогового режима работы, мы объ-
явим два пустых класса для использования в качестве индикаторов: класс
unknown_exception
, означающий получение неизвестного ответа от пользовате-
ля, и класс abort_exception, сигнализирующий о необходимости немедленного
выхода из программы. Сама программа задаёт пользователю вопрос о выполне-
нии последовательно 100 неких абстрактных пронумерованных команд. Диалог
реализуется функцией confirm(), спрашивающей у пользователя подтвержде-
ние на выполнение команды с заданным номером и анализирующей ответ (’y’ —
подтверждение, ’n’ — отказ, ’a’ — немедленный выход).
#include 
#include 
using namespace s t d ;
c l a s s unknown_exception { } ;
c l a s s a b o r t _ e x c e p t i o n { } ;
bool c o n f i r m ( i n t i )
{
char c ;
c o u t << "Подтвердите команду " << i << " ( y / n / a - да/нет/выход) : " ;
c i n >> c ;
c i n . i g n o r e ( ) ; //очищаем буфер если введены лишние символы
switch ( c ) {
case ’ y ’ : return true ;
case ’ n ’ : return f a l s e ;
case ’ a ’ : throw a b o r t _ e x c e p t i o n ( ) ;
defa ult : throw unknown_exception ( ) ;
}
}
main ( )
{
c o u t << "Демонстрация диалога подтверждения при выполнении"<<" 1 0 0 команд\ n " ;
f o r ( i n t i =1; i <=100; i ++) {
try {
i f ( c o n f i r m ( i ) ) c o u t << "КОМАНДА "<< i <<" ВЫПОЛНЕНА\ n " ;
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.


308
Download 5,27 Mb.

Do'stlaringiz bilan baham:
1   ...   131   132   133   134   135   136   137   138   ...   193




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish