Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Обработка ошибок в с++

-

Общение и обсуждение, архив Point Blank

- Раздел помощи Пользователям и обсуждений по вопросам Point Blank. Ваши вопросы и просьбы в этом разделе

Ответ
 
Опции темы
Старый 02.04.2012, 17:01   #1
 Разведчик
Аватар для TheNevermore
 
TheNevermore вызывает надежду
Регистрация: 13.03.2012
Сообщений: 0
Популярность: -31
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
 
Exclamation Обработка ошибок в с++

Всем привет,предоставляю немного теории,так как на форуме много людей,что пишут вх,незная азов в языке с++

Обработка ошибок
Создатель библиотеки способен обнаружить динамические ошибки, но не представляет какой в общем
случае должна быть реакция на них. Пользователь библиотеки способен написать реакцию на такие
ошибки, но не в силах их обнаружить. Если бы он мог, то сам разобрался бы с ошибками в своей
программе, и их не пришлось бы выявлять в библиотечных функциях. Для решения этой проблемы в
язык введено понятие особой ситуации.
Только недавно комитетом по стандартизации С++ особые ситуации были включены в стандарт языка,
но на время написания этой книги они еще не вошли в большинство реализаций.
Суть этого понятия в том, что функция, которая обнаружила ошибку и не может справиться с нею,
запускает особую ситуацию, рассчитывая, что устранить проблему можно в той функции, которая прямо
или опосредованно вызывала первую. Если функция рассчитана на обработку ошибок некоторого вида,
она может указать это явно, как готовность перехватить данную особую ситуацию.
Рассмотрим в качестве примера как для класса Vector можно представлять и обрабатывать особые
ситуации, вызванные выходом за границу массива:
class Vector {
int* p;
int sz;
public:
class Range { }; // класс для особой ситуации
int& operator[](int i);
// ...
};
Предполагается, что объекты класса Range будут использоваться как особые ситуации, и запускать их
можно так:
int& Vector:perator[](int i)
{
if (0<=i && i<sz) return p[i];
throw Range();
}
Если в функции предусмотрена реакция на ошибку недопустимого значения индекса, то ту часть
функции, в которой эти ошибки будут перехватываться, надо поместить в оператор try. В нем должен
быть и обработчик особой ситуации:
void f(Vector& v)
{
// ...
try {
do_something(v); // содержательная часть, работающая с v
}
catch (Vector::Range) {

// обработчик особой ситуации Vector::Range
// если do_something() завершится неудачно,
// нужно как-то среагировать на это
// сюда мы попадем только в том случае, когда
// вызов do_something() приведет к вызову Vector:perator[]()
// из-за недопустимого значения индекса
}
// ...
}
Обработчиком особой ситуации называется конструкция
catch ( /* ... */ ) {
// ...
}
Ее можно использовать только сразу после блока, начинающегося служебным словом try, или сразу
после другого обработчика особой ситуации. Служебным является и слово catch. После него идет в
скобках описание, которое используется аналогично описанию формальных параметров функции, а
именно, в нем задается тип объектов, на которые рассчитан обработчик, и, возможно, имена
параметров (см. $$9.3). Если в do_something() или в любой вызванной из нее функции произойдет
ошибка индекса (на любом объекте Vector), то обработчик перехватит особую ситуацию и будет
выполняться часть, обрабатывающая ошибку. Например, определения следующих функций приведут к
запуску обработчика в f():
void do_something()
{
// ...
crash(v);
// ...
}

void crash(Vector& v)
{
v[v.size()+10]; // искусственно вызываем ошибку индекса
}
Процесс запуска и перехвата особой ситуации предполагает просмотр цепочки вызовов от точки
запуска особой ситуации до функции, в которой она перехватывается. При этом восстанавливается
состояние стека, соответствующее функции, перехватившей ошибку, и при проходе по всей цепочке
вызовов для локальных объектов функций из этой цепочки вызываются деструкторы. Подробно это
описано в $$9.4.
Если при просмотре всей цепочки вызовов, начиная с запустившей особую ситуацию функции, не
обнаружится подходящий обработчик, то программа завершается. Подробно это описано в $$9.7.
Если обработчик перехватил особую ситуацию, то она будет обрабатываться и другие, рассчитанные на
эту ситуацию, обработчики не будут рассматриваться. Иными словами, активирован будет только тот
обработчик, который находится в самой последней вызывавшейся функции, содержащей
соответствующие обработчики. В нашем примере функция f() перехватит Vector::Range, поэтому эту
особую ситуацию нельзя перехватить ни в какой вызывающей f() функции:
int ff(Vector& v)
{
try {
f(v); // в f() будет перехвачена Vector::Range
}
catch (Vector::Range) { // значит сюда мы никогда не попадем
// ...
}
}[/COLOR][/SIZE][/FONT]

Последний раз редактировалось TheNevermore; 02.04.2012 в 17:40.
  Ответить с цитированием
Пользователь сказал cпасибо:
valdes132011 (02.04.2012)
Старый 02.04.2012, 17:29   #2
Заблокирован
 Рыцарь-капитан
Аватар для warl0ck
 
warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(warl0ck сломал счётчик популярности :(
Регистрация: 29.01.2010
Сообщений: 547
Популярность: 41279
Сказал(а) спасибо: 692
Поблагодарили 2,270 раз(а) в 1,035 сообщениях
 
По умолчанию Re: Обработка ошибок в с++

сделай текст читаемым + отключи смайлы в тексте
  Ответить с цитированием
Старый 02.04.2012, 18:30   #3
 Разведчик
Аватар для Евгеша390
 
Евгеша390 на правильном путиЕвгеша390 на правильном пути
Регистрация: 14.03.2011
Сообщений: 17
Популярность: 174
Сказал(а) спасибо: 138
Поблагодарили 60 раз(а) в 44 сообщениях
Отправить сообщение для Евгеша390 с помощью Skype™
 
По умолчанию Re: Обработка ошибок в с++

Спасибо, пригодится)
________________
Помог? - Поставь "спасибо" или +
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
  Ответить с цитированием
Старый 02.04.2012, 19:24   #4
 Разведчик
Аватар для Falkor 007
 
Falkor 007 никому не известный тип
Регистрация: 13.01.2012
Сообщений: 1
Популярность: 12
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Обработка ошибок в с++

Думаю не помешает выделить текст от кода цветами, в этом правда не разбираюсь, но в цветах будет понятнее, уверен в этом потому что html когда изучал, в цветах было удобнее)))
  Ответить с цитированием
Старый 02.04.2012, 19:30   #5
 Разведчик
Аватар для DefenderYO
 
DefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нацииDefenderYO гордость нации
Регистрация: 08.09.2010
Сообщений: 44
Популярность: 2640
Сказал(а) спасибо: 328
Поблагодарили 150 раз(а) в 131 сообщениях
 
По умолчанию Re: Обработка ошибок в с++

Евгеша390, ты хоть прочитал?
________________

Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Услуги] Обработка вашего видео Carlsson Товары/услуги в Сети 11 03.09.2012 19:22
[Помогите!] Обработка HTTP запросов. *Хalyava* Вопросы и ответы, обсуждения 2 08.11.2011 20:31

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 21:36.

Пишите нам: forum@zhyk.ru
Copyright © 2025 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net