Краткие теоретические сведения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Краткие теоретические сведения



При выполнении операторов программы могут встретиться проблемы различного уровня и характера. Одни из них непреодолимы, например, деление на 0, другие могут потребовать вмешательства оператора. Например, вводимая фамилия содержит более 255 символов.

При невозможности продолжать выполнение программы, в системе возбуждается исключительная ситуация. Многие языки программирования, в том числе язык C++, предусматривают исключительные ситуации (exceptions), представляющие собой механизм для обработки ошибок.

Для обработки проблем типа слишком длинной фамилии, можно сгенерировать (throw) исключительную ситуацию.

При делении на 0 система сообщает о возникновении ошибки и прекращает работу. Может потребоваться дополнительная обработка исключительной ситуации – например, определение номера оператора, вызвавшего ошибку.

Говорят, что код, предназначенный для работы с исключительной ситуацией, перехватывает (catch), или обрабатывает (handle) ее.

Перехват исключительной ситуации. Для перехвата исключительной ситуации в языке C++ предусмотрены блоки try- catch (try-catch blocks). Оператор, который может породить исключительную ситуацию, следует поместить в блок try. За этим блоком должны следовать один или несколько блоков catch. В каждом блоке catch должен быть указан тип исключительной ситуации, для перехвата которой он предназначен. С блоком try могут быть связаны несколько блоков catch, даже если отдельный оператор может порождать исключительные ситуации нескольких типов. Кроме того, блок try может содержать много операторов, каждый из которых может генерировать исключительную ситуацию. Общая синтаксическая конструкция блока try приведена ниже.

try

{

оператор(ы);

}

 

Синтаксис блока catch выглядит так.

catch (КлассИсключительнойСитуации:идентификатор )

{

операторы

}.

Для каждого типа исключительной ситуации нужно применять отдельный блок catch, предназначенный для ее обработки

Когда операторы, помещенные в блок try, порождают исключительную ситуацию, оставшаяся часть блока try игнорируется, а управление передается операторам, размещенным в блоке catch, соответствующем типу возникшей исключительной ситуации. Затем выполняются операторы блока catch. Выполнение программы возобновляется, начиная с точки, следующей за последним блоком catch. Если для порожденной исключительной ситуации не подходит ни один блок catch, программа завершается аварийно.

Обратите внимание, если исключительная ситуация генерируется в середине блока try, вызываются деструкторы всех локальных объектов этого блока. Это гарантирует освобождение всех ресурсов, захваченных блоком, даже если он не будет выполнен до конца.

Приведем пример программы обработки исключительной ситуации.

#include <iostream>

 using namespace std;

int main(int argc, char* argv[])

{

int a, b;

cout << "Введите числа a и b " << endl;

cin>>a>>b;

try

{

   a=a/b;

   a=a+1;

}

catch (...)

{

cout << "Program mistake" << endl;

}

cout << "Good Day C++!" << endl;

return 0;

}

В программе обрабатывается деление на 0 и переполнение.

Генерирование исключительных ситуаций. Когда внутри функции обнаруживается ошибка, исключительную ситуацию можно сгенерировать с помощью оператора следующего вида.

Srow КлассИсключительнойСитуации (стро ковыйАргумент);

Здесь обозначение КлассИсключительнойСитуации относится к типу исключительной ситуации, которую необходимо сгенерировать, а запись стро ковыйАргумент означает аргумент конструктора этого класса, описывающий возникающую ошибку. При выполнении оператора throw оставшийся код функции не выполняется, а исключительная ситуация передается обратно в точку, из которой была вызвана функция.

В стандартной библиотеке C++ можно найти класс исключительной ситуации, удовлетворяющий потребностям программы. Однако программист может определять свой собственный класс исключительных ситуаций. При этом в качестве базового обычно используется класс исключительных ситуаций exception, или один из производных от него классов. Это обеспечивает возможности стандартизированной работы с исключительными ситуациями. В частности, все исключительные ситуации, предусмотренные в стандартной библиотеке языка C++, содержат функцию-член what, возвращающую сообщение, описывающее возникшую исключительную ситуацию. Если при создании своего собственного класса исключительных ситуаций в качестве базового применяется класс exception, нужно использовать пространство имен std.

Чтобы указать, какая исключительная ситуация будет генерироваться функцией, включите раздел throw в заголовок функции, как показано ниже.


void myMethod (int x)

throw (BadArgException, MyException)

if (х == МАХ)

throw BadArgException("BadArgException: причина");

// Какой-то код

throw MyException("MyException: причина"); } //  

Конец функции myMethod

Включение раздела throw в спецификацию функции гарантирует, что данная функция сможет генерировать только указанные исключительные ситуации. Попытка возбудить любую другую исключительную ситуацию приведет к аварийному завершению работы программы.

Если оператор в блоке try генерирует исключительную ситуацию, оставшаяся часть блока игнорируется, и управление передается блоку catch, предназначенному для обработки исключительных ситуаций этого типа. Затем выполняются операторы блока catch. После завершения этого блока выполнение программы возобновляется с точки, следующей за последним оператором блока catch. Если возникшая исключительная ситуация не может быть обработана ни одним боком catch, выполнение программы завершается аварийно.

Обратите внимание, что если исключительная ситуация возбуждается внутри блока try, вызываются деструкторы всех локальных объектов этого блока. Это позволяет гарантировать, что все ресурсы, задействованные в этом блоке, будут освобождены, даже если блок будет выполнен не полностью. Компилятор выбирает подходящий блок catch, перебирая их один за другим в порядке, указанном в программе. Подходящим считается блок catch, аргумент которого совпадает с возникшей исключительной ситуацией. Таким образом, разделы catch должны быть упорядочены, так чтобы первыми оказались блоки, предназначенные для обработки более узких исключительных ситуаций, а разделы, ориентированные на более общие типы, должны размещаться за ними.

Рассмотрим пример.

string str = "Sarah";

Try

{

str.substr(99, 1);

// Здесь размещаются другие операторы

} // Конец блока try

   catch (exception e)

{

cout << "Перехвачено что-то другое" << endl;

} // Конец блока catch

catch (out_of__range e)

{

   cout << "Перехвачена исключительная ситуация out_of_range" << endl;

} / / Конец блока catch

При компиляции этого фрагмента программы на экране появляется следующее предупреждение.

TestExceptionExample.срр(11): warning С4286:

'class std::out_of_range': is caught by base class

('class exception') online 8

Linking...

Чтобы скомпилировать этот код без предупреждений, нужно поменять местами два раздела catch.

Программа, приведенная ниже, демонстрирует, что произойдет, если исключительная ситуация будет сгенерирована, но не обработана. Программа кодирует строку, выполняя простую подстановку. Каждая буква исходной строки заменяется буквой, расположенной в алфавите на три позиции ниже. Достигнув конца алфавита, мы переходим на его начало. Например, буква 'а' заменяется буквой 'd', буква Ъ' — буквой 'е', а буква 'х' — буквой 'а'. Поток управления при возникновении исключительной ситуации в этой программе показан на рис.

#include <iostream>

#include <string>

using namespace std;

void encodeChar(int i, string& str)

{

int base;

if (islower(str[i]))

base = int ('a');

Else

base = int ('A');

char newChar = (int(str[i]) - base +3) % 26 + base;

str.replace(i, 1, 1, newChar);

} // Конец функции encodeChar

void encodeString (int numChar, string^ str)

{

for (int i = numChar-1; i>=0; i--)

encodeChar(i, str);

} //Конец функции encodeString

int mainO

{

string strl = "Sarah";

encodeString(99, strl);

return 0;

} // Конец оператора main


Рис.. Поток управления при необработанной исключительной ситуации

На самом деле метод encodeChar порождает исключительную ситуацию out_of_range, которая генерируется, когда происходит попытка доступа к 99-му символу строки str при вызове str.replace (99, I, 1, newChar), Поскольку эта исключительная ситуация в функции encodeChar не обрабатывается, выполнение функции прерывается, а исключительная ситуация возвращается в функцию encodeString, а именно: в точку вызова функции encodeChar.

Функция encodeString также не обрабатывает данную исключительную ситуацию, поэтому ее выполнение также прерывается, а исключительная ситуация передается в функцию main. Поскольку и там обработка исключительной ситуации не предусмотрена, происходит аварийное завершение программы.

Методические указания.

 

Варианты заданий.

В качестве системы объектов выбрать задание работы 8

10 Классы и объекты в С ++

Данную работу сделать по Буч

Цель.

Получить практические навыки реализации классов на С++.

10.2Основное содержание работы.

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Выполнить исследование вызовов конструкторов и деструкторов.



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 37; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.54.6 (0.023 с.)