C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet44/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   40   41   42   43   44   45   46   47   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
65 
void f1(int) throw(); 
void f1(int) throw(Exception); // 
Повторяющаяся сигнатура! 
Спецификация исключений для виртуальных функций 
В главе 2 мы говорили (точнее, я говорил, а вы слушали) об отличиях между перегрузкой (overloading
и переопределением (overriding). Если виртуальная функция в производном классе объявляется с новой 
сигнатурой, отсутствующей в базовом классе, эта функция скрывает все одноименные функции 
базового класса (если вы в чем-то не уверены, вернитесь к соответствующему разделу; это важно 
понимать). Аналогичный принцип действует и для спецификаций исключений. 
class Foo { 
public: 
virtual Fn() throw(int); 
}; 
class Bar : public Foo { 
public: 
virtual Fn() throw(char*); 
// Осторожно! 
}; 
Компилятор косо посмотрит на вас, но откомпилирует. В результате тот, кто имеет дело с 
Foo*
, будет 
ожидать исключения типа 
int
, не зная, что на самом деле он имеет дело с объектом 
Ваr

инициирующим нечто совершенно иное. 
Мораль ясна: не изменяйте спецификацию исключений виртуальной функции в производных классах. 
Только так вам удастся сохранить контракт между клиентами и базовым классом, согласно которому 
должны инициироваться только исключения определенного типа. 
Непредусмотренные исключения 
Если инициированное исключение отсутствует в спецификации исключений внешней функции, 
программа переформатирует ваш жесткий диск. Шутка. На самом деле она вызывает функцию с 
именем 
unexpected()
. По умолчанию затем вызывается функция 
terminate()
, о которой будет 
рассказано ниже, но вы можете сделать так, чтобы вызывалась ваша собственная функция. 
Соответствующие интерфейсы из заголовочного файла except.h выглядят так: 
typedef void (*unexpected_function)(); 
unexpected_function set_unexpected(unexpected_function excpected_func); 
В строке 
typedef...
объявляется интерфейс к вашей функции. Функция 
set_unexpected()
получает функцию этого типа и организует ее вызов вместо функции по умолчанию. Функция 
set_unexpected()
возвращает текущий обработчик непредусмотренных исключений. Это позволяет 
временно установить свой обработчик таких исключений, а потом восстановить прежний. В 
следующем фрагменте показано, как используется этот прием. 
unexpected_function my_handler(void) { 
// 
Обработать неожиданное исключение 

{ // 
Готовимся сделать нечто страшное и устанавливаем свой обработчик 
unexpected_function old_handler = set_unexpected(my_handler); 
// 
Делаем страшное и возвращаем старый обработчик 
set_unexpected(old_handler); 

Функция-обработчик не может нормально возвращать управление вызывающей программе, если в ней 
встречается оператор 
return
или при выходе из области действия функции результаты будут 
неопределенными. Тем не менее, из функции можно запустить исключение и продолжить поиск 
перехватчика, подходящего для нового исключения. 


 66 
Синтаксис перехвата исключений 
Чтобы перехватить исключение, поставьте перед блоком ключевое слово 
try
и поместите после него 
одну или несколько секций 
catch
, которые называются обработчиками (handlers). 
try { 
// 
Фрагмент, который может инициировать исключения 

catch (Exception_Type t) { 
// 
Восстановление после исключения типа Exception_Type 

catch (...) { 
// 
Восстановление после исключений всех остальных типов 

Каждый обработчик, за исключением (опять нечаянный каламбур) обработчика с многоточием, 
соответствует одному конкретному типу ошибок. Если из фрагмента, называемого 
try
-блоком, 
инициируется исключение, компилятор просматривает список обработчиков в порядке их 
перечисления и ищет обработчик, подходящий по типу запущенного исключения. Многоточие 
соответствует исключениям любого типа; если такой обработчик присутствует, он должен находиться 
последним в списке. 
Внутри обработчика вы можете предпринимать любые действия для выхода из ситуации. Сведения об 
исключении можно получить из аргумента 
catch
— кроме обработчика с многоточием, который 
понятия не имеет, что он должен перехватывать. 
Выполнение программы после исключения 
Если выполнение 
try
-блока обходится без исключений, программа благополучно игнорирует все 
обработчики и продолжает работу с первого выражения за последним обработчиком. Если же 
исключение все же произошло, оно будет единственным из всего списка, и после его обработки 
выполнение программы продолжится за последним обработчиком списка. Существуют два исключения 
(последний нечаянный каламбур): обработчик может содержать вызов крамольного 
goto
или 
запустить исключение. Если обработчик инициирует исключение, он может продолжить 
распространение того же исключения или создать новое. 
catch(int exception) { 
// 
Сделать что-то, а затем 
throw(“Help!”); 
// 
Инициируется исключение типа char* 

Инициирование исключения из обработчика немедленно завершает выполнение вмещающей функции 
или блока. 
Если исключение не перехвачено 
Если для исключения не найдется ни одного обработчика, по умолчанию вызывается глобальная 
функция 
terminate()
. Как вы думаете, что она делает? По умолчанию 
terminate()
в конечном 
счете вызывает библиотечную функцию 
abort()
, и дело кончается аварийным завершением всей 
программы. Вы можете вмешаться и установить собственную функцию завершения с помощью 
библиотечной функции 
set_terminate()
. Соответствующий фрагмент файла except.h выглядит так: 
typedef void (*terminate_function)(); 
termination_function set_terminate(terminate_function t_func); 
В строке 
typedef...
объявляется интерфейс к вашей функции завершения. Функция 
set_terminate()
устанавливает функцию завершения, которую вместо функции 
abort()
вызывает 
функция 
terminate()
. Функция 
set_terminate()
возвращает текущую функцию завершения, 
которую позднее можно восстановить повторным вызовом 
set_terminate()




Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   40   41   42   43   44   45   46   47   ...   144




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