История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Топ:
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Дисциплины:
2017-11-27 | 348 |
5.00
из
|
Заказать работу |
|
|
Иногда возникает положение, при котором необходимо обработать исключительную ситуацию сначала на более низком уровне вложенности блока try, а затем передать ее на более высокий уровень для продолжения обработки. Для того чтобы сделать это, нужно использовать throw без аргументов. В этом случае исключительная ситуация будет перенаправлена к следующему подходящему обработчику (подходящий обработчик не ищется ниже в текущем списке - сразу осуществляется поиск на более высоком уровне). Приводимый ниже пример демонстрирует организацию такой передачи. Программа содержит вложенный блок try и соответствующий блок catch. Сначала происходит первичная обработка, затем исключительная ситуация перенаправляется на более высокий уровень для дальнейшей обработки.
#include<iostream.h>
void func(int i)
{ try{
if(i) throw "Error";
}
catch(char *s) {
cout<<s<<"- выполняется первый обработчик"<<endl;
throw;
}
}
void main()
{ try{
func(1);
}
catch(char *s) {
cout<<s<<"- выполняется второй обработчик"<<endl;
}
}
Результат выполнения программы:
Error - выполняется первый обработчик
Error - выполняется второй обработчик
Если ключевое слово trow используется вне блока catch, то автоматически будет вызвана функция terminate(), которая по умолчанию завершает программу.
Исключительная ситуация, генерируемая оператором new
Следует отметить, что некоторые компиляторы поддерживают генерацию исключений в случае ошибки выделения памяти посредством оператора new, в частности исключения типа bad_alloc. Оно может быть перехвачено и необходимым образом обработано. Ниже в программе рассмотрен пример генерации и обработки исключительной ситуаций bad_alloc. Искусственно вызывается ошибка выделения памяти и перехватывается исключительная ситуация.
|
#include <new>
using std::bad_alloc;
#include <iostream.h>
void main()
{ double *p;
try{
while(1) p=new double[100]; // генерация ошибки выделения памяти
}
catch(bad_alloc exept) { // обработчик xalloc
cout<<"Возникло исключение"<<exept.what()<<endl;
}
}
В случае если компилятором не генерируется исключение bad_alloc, то можно это исключение создать искусственно:
#include <new>
using std::bad_alloc;
#include <iostream.h>
void main()
{ double *p;
bad_alloc exept;
try{
if(!(p=new double[100000000])) // память не выделена p==NULL
throw exept; // генерация ошибки выделения памяти
}
catch(bad_alloc exept) { // обработчик bad_alloc
cout<<"Возникло исключение "<<exept.what()<<endl;
}
}
Результатом работы программы будет сообщение:
Возникло исключение bad allocation
Оператор new появился в языке C++ еще до того, как был введен механизм обработки исключительных ситуаций, поэтому первоначально в случае ошибки выделения памяти этот оператор просто возвращал NULL. Если требуется, чтобы new работал именно так, надо вызвать функцию set_new_handler() с параметром 0. Кроме того, с помощью set_new_handler() можно задать функцию, которая будет вызываться в случае ошибки выделения памяти. Функция set_new_handler (в заголовочном файле new) принимает в качестве аргумента указатель на функцию, которая не принимает никаких аргументов и возвращает void.
#include<new>
#include<iostream>
using namespace std;
void newhandler()
{ cout << "The new_handler is called: ";
throw bad_alloc();
return;
}
main()
{ char* ptr;
set_new_handler (newhandler);
try {
ptr = new char[~size_t(0)/2];
delete[ ] ptr;
}
catch(bad_alloc &ba) {
cout << ba.what() << endl;
}
}
Результатом работы функции является:
The new_handler is called: bad allocation
В new.h так же определена функция _set_new_handler, аргументом которой является указатель на функцию возвращающую значение типа int и получающую аргумент типа size_t, указывающий размер the amount of space to be allocated.
#include <new.h>
#include <iostream.h>
int error_alloc(size_t) // size_t unsigned integer результат sizeof operator.
{ cout << "ошибка выделения памяти" <<endl;
return 0;
}
void main(void)
{
_set_new_handler(error_alloc);
int *p = new int[10000000000];
}
Результатом работы функции является:
ошибка выделения памяти
В случае, если память не выделяется и не задается никакой функции-аргумента для set_new_handler, оператор new генерирует исключение bad_alloc.
|
|
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!