Исключения. Способы обработки исключений. Обработка исключений в языке С++

Обработка исключений в языках программирования. Общее понятие исключительных ситуаций, их классификация, механизм обработки. Обработка исключений в языке программирования С++: сообщения об ошибках, стандартные исключения С++ и их механизм обработки.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.12.2017
Размер файла 114,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Московский технологический университет» МГТУ МИРЭА

Факультет: Кибернетика

Кафедра: Информационная безопасность

КУРСОВАЯ РАБОТА

по дисциплине «Языки программирования»

Тема: «Исключения. Способы обработки исключений. Обработка исключений в языке С++.»

Выполнила: студентка гр. ККСО-01-15

Егорова А. К.

Проверила: д. т. н., профессор

Лукинова О. В.

Москва 2016

Содержание

Введение

Глава I. Обработка исключений в языках программирования

1.1 Общее понятие исключительных ситуаций

1.2 Классификация исключений

1.3 Механизмы обработки исключений

1.4 Классификация обработки исключений по стадиям обработки кода

Глава II. Обработка исключений в языке программирования С++

2.1 Сообщения об ошибках

2.2 Стандартные исключения С++

2.3 Механизм обработки исключений в С++

Заключение

Список использованной литературы

Введение

программирование исключение язык обработка

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

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

Для осуществления обозначенной цели поставим следующие задачи:

1. Изучить специальную литературу по рассматриваемой проблеме;

2. Дать определение понятию «исключение», рассмотреть виды исключений, а так же способы их обработки;

3. Изучить процесс обработки исключений на примере конкретного языка программирования (С++);

Объект исследования - методы обработки исключений.

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

Глава I. Обработка исключений в Языках программирования

1.1 Общее понятие исключительных ситуаций

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

Требования к аппарату исключений:

1. Полнота исключений - на любое исключения должна быть предусмотрена реакция исполнителя;

2. Минимальность возмущений - затраты на учет чрезвычайных ситуаций должны быть чрезвычайно малы;

3. Минимальность повреждений - ущерб при возникновении исключительных ситуаций должен быть минимальным.

Исключительная ситуация (или исключение) - это ошибка, которая возникает во время выполнения программы.[1]

1.2 Классификация исключений

Ошибки при написании, отладке и работе программ можно разделить на этапы времени их возникновения:

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

2. Ошибки выполнения являются самыми непредсказуемыми. Они могут иметь разную природу, и соответственно, по-разному проявляться. Часть ошибок обнаруживается и обрабатывается операционной системой.

3. Ошибки компоновки связаны с проблемами, обнаруженными при разрешении внешних ссылок. В разных языках может осуществляться на различных этапах. Так же как и в случае с ошибками компилятора, для успешного создания исполняемого файла программы необходимо устранить все ошибки компоновки.

1.3 Классификация обработчиков

Обработчики исключений можно разделить две категории:

1. Встроенные - обработчики «стандартных» исключений, которые встречаются достаточно часто, описаны создателями языка.

2. Пользовательские - обработчики для исключений, не предусмотренных создателями языка.

Пользовательские обработчики можно реализовать с помощью:

1. Специальных языковых конструкций (try-catch);

2. Стандартные языковые конструкции, чтобы обрабатывать выход за границу диапазона вводимых значений (например, с помощью условного оператора).

1.4 Классификация обработки исключений по стадиям обработки кода

Обработка исключений на стадии компиляции [4]

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

Лексический анализатор:

В случае если лексема является корректной для соответствующего типа токена, лексический анализатор должен вернуть этот токен синтаксическому анализатору, и позволить ему обработать ошибку;

Если лексический анализатор не способен продолжать работу, так как ни один из шаблонов не соответствует префиксу оставшегося входного потока, то простейшей стратегией в этой ситуации будет воостановление в режиме «паники». Мы просто удаляем входные символы до тех пор, пока лексический анализатор не встретит распознаваемый токен в начале оставшейся входной строки. Этот метод восстановления может запутать синтаксический анализатор, но он вполне подходит ля интерактивной среды.

Существуют и другие возможные действия по восстановлению после ошибки:

1. Удаление одного символа из оставшегося входного потока;

2. Вставка пропущенного символа в оставшийся входной поток;

3. Замена символа другим;

4. Перестановка двух соседних символов.

5. Вышеперечисленные преобразования пытаются исправить входной поток.

Синтаксический анализатор:

1. «Режим паники». Синтаксический анализатор пропускает символы , пока не будет найден один из специально определенного множества синхронизирующих токенов (; или });

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

Обработка исключений на стадии компоновки [4]

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

1. Компоновщик выдает сообщение об ошибке, если не может найти определение для символа, на который найдена ссылка.

2. Если найдено два определения для символа, то обработка может отличаться в зависимости от языка программирования:

С++: язык имеет ограничение, известное как «правило одного определения», которое гласит, что должно быть только одно определение для каждого символа.

С: должно быть точно одно определение для любой функции и инициализированной глобальной переменной, но определение неинициализированной переменной может быть трактовано как предварительное определение. Язык С таким образом разрешает различным исходным файлам содержать предварительное определение одного и того же объекта.

Fortran: существует возможность иметь копию каждой глобальной переменной в каждом файле, который на ней ссылается. Компоновщику тогда необходимо убрать дубликаты, выбрав одну копию (самую большую, если они отличаются в размере) и выбросить все остальные. Эта модель называется «общей моделью».

Обработка исключений на стадии выполнения

Подход к обработке ошибок времени выполнения заключается в следующем: выделяется блок кода, при выполнении которого могут происходить ошибки; выделяется блок кода, который отвечает за обработку произошедших ошибок.

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

try

{

//Код, который может сгенерировать исключение;

}

catch(type id)

{

//обработка исключения типа type

}

//код программы

1.

Глава II. Обработка исключений в языке программирования С++

2.1 Сообщения об ошибках

Сообщения об ошибках от компилятора [5]

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

Пример сообщений компилятора GNU:

main.cpp:33: Warning: не скомпилированный параметр «signalNr»

main.cpp: в функции >>int main(int, char**)<<:

main.cpp:174: Warning: переменная “db” не используется

main.cpp:157: Error: >>Element<< не определен в данной области действия

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

Типичные сообщения об ошибках:

1) Отсутствует определение: отсутствие определения переменной, ошибка в написании имени переменной, определение переменной вне области видимости, вызов неопределенной/необъявленной функции;

2) Неиспользуемая переменная;

3) Отсутствует элемент класса: компилятору не хватает определения;

4) …excepted/ожидается: компилятор «удивлен» обнаружением/отсутствием определенного элемента в этом месте.

Сообщения об ошибках от компоновщика[5]

Если компилятор удовлетворен исходным кодом, в действие вступает компоновщик. Причины ошибок компоновщика могут быть следующие:

1) Если при обработке кода компилятором уже было выдано предупреждение, то имя функции может быть неверно написано или отсутствовать команда #define;

2) Библиотека не подключена;

3) Библиотека располагается в каталоге, где компоновщик не ищет библиотеки. Если библиотека не расположена по стандартному пути, её каталог должен быть внесен в настройки или указан в командной строке компилятора со свойством -L.

4) Компоновщик привязывает библиотеки только тогда, когда существует открытое указание это делать.

2.2 Стандартные исключения C++ [2]

Библиотечные исключения являются частью иерархии классов, вершина которой - стандартный библиотечный класс exception, представленный в <stdexcept>.

class exception {

public:

exception() throw();

exception (const exception&) throw();

exception& operator = (const exception&) throw();

virtual ~exception() throw();

virtual const char* what() const throw();

private:

//...

}

Эта иерархия выгладит следующим образом:

logic_error: ошибки, принадлежащие этому классу, можно перехватить либо до запуска программы, либо путем тестирования функций или конструкторов.

length_error: базовый класс для всех исключений, создаваемых для сообщения о попытке создания слишком длинного объекта. Исключения этого класса генерируются при попытке создания объекта большего, чем максимальный объект размера типа size_t. Обработка «ошибочной инициализации» ;

domain_error: базовый класс для всех исключений, которые генерируются при выходе из математической области допустимых значений (корень из отрицательного числа, логарифм неположительного числа). Обработка ошибки «некорректная операция»;

out_of_range: базовый класс для всех исключений, создаваемых для сообщения о том, что аргумент выходит за допустимый диапазон. Исключения этого класса генерируются при попытке вызова функции с параметром, не входящие в допустимые значения. Обработка ошибки «некорректная передача парметров»;

invalid_argument: базовый класс для всех исключений, создаваемых для сообщения о недопустимом аргументе. Исключения этого класса генерируются при попытке вызова функции с неверным параметром. Обработка ошибки «некорректная передача параметров».

runtime_error: базовый класс для всех исключений, которые можно перехватить только при выполнении программы.

range_error: базовый класс для всех исключений, создаваемых для сообщения об ошибке в диапазоне. Исключение range_error выбрасывается при попытке передать аргументом в функцию число, которое не входит в допустимый диапазон аргумента этой функции. Класс исключений обрабатывает ошибку «некорректная работа с переменными».

overflow_error: базовый класс для всех исключений, создаваемых для сообщения об арифметическом переполнении. Данный класс исключений обрабатывает «некорректные вычисления»;

underflow_error: базовый класс для всех исключений, создаваемых для сообщения об арифметической неточности. Исключение underflow_error генерируется при исчезновении порядка (результат слишком маленький для указанного типа данных). Такой класс исключений обрабатывает ошибку «игнорирование способов уменьшения погрешности».

bad_alloc: класс, описывающий исключение, возникновение которого указывает на то, что запрос на выделение памяти не выполнен. Как правило, данное исключение генерируется оператором new;

bad_exception: класс определяет тип объектов, которые может выбросить обработчик не специфицированных исключений.

bad_cast: класс всех исключений, создаваемых для сообщения об ошибке привидения к ссылочному типу. Исключения этого класса генерируется оператором dynamic_cast, когда попытка приведения типа является некорректной. Данный класс обрабатывает ошибку «некорректные вычисления»;

bad_typeid: класс всех исключений, которые вызываются оператором typeid, если оператор typeid является пустым (NULL) указателем. Данный класс обрабатывает ошибку «некорректная работа с переменными»;

ios_base::failure: базовый класс всех объектов, создаваемых в виде исключений, функциями ввода-вывода в библиотеке. Это исключение обычно генерируется при изменении состояния потока вследствие ошибки или достижения конца файла. Обработка ошибки «некорректное определение данных».

2.3 Механизм обработки исключений в С++[3]

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

Управление С++ - механизмом обработки исключений зиждется на трех ключевых словах:try, catch и throw. В общих чертах их работа состоит в следующем: программные инструкции, которые вы считаете нужным проконтролировать, помещаются в try-блок. Если исключение возникает в этом блоке, оно дает знать о себе выбросом определенного рода информации (с помощью throw). Это выброшено исключение может быть перехвачено программным путем с помощью catch-блока и обработано соответствующим образом.

Код, в котором возможно возникновение исключительной ситуации, должен выполняется в рамках try-блока. (Любая функция, вызываемая в рамках этого блока, так же подвергается контролю.) Исключения, которые могут быть «выброшены» контролируемым кодом, перехватываютсяcatch-инструкцией, непосредственно следующей за try-блоком, в котором фиксируются выбросы этих исключений. Общий формат try- и catch- блоков выглядит так:

try {

// try-блок, подлежащий проверке на наличие ошибок

}

catch (type1 arg) {

// catch-блок (обработчик исключения типа type1);

}

catch (type2 arg) {

// catch-блок (обработчик исключения типа type2);

// . . .

catch (typeN arg){

//catch-блок (обработчик исключения типа typeN);

}

try-блок может включать в себя несколько инструкций некоторой функции или охватывать весь код функции main().

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

Общий формат инструкции throw выглядит так:

throw exception;

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

Если в программе случится «выброс» исключения, для которого не предусмотрена соответствующая catch-инструкция, произойдет аварийное завершение программы.

Пример обработки исключения:

#include<iostream>

using namespace std;

int main()

{

cout<< “НАЧАЛО\n”;

try{

cout << “В try-блоке\n”;

throw 99; //генерирование ошибки

cout<< “Эта инструкция не будет выполнена.”;

}

catch (int i) {

cout<<”Перехват исключения. Его значение равно“;

cout << i << “\n”;

}

cout << “КОНЕЦ”;

return 0;

}

Результат:

НАЧАЛО

В try-блоке

Перехват исключения. Его значение равно: 99

КОНЕЦ

Здесь try-блок содержит три инструкции, инструкция catch (int i)предназначена для обработки исключений целочисленного типа. В этом try-блоке выполняется только две из трёх инструкции: cout и throw. После генерирования исключения управление предается catch-выражению, при этом выполнение try-блока прекращается.

catch-инструкция не вызывается, а просто с неё продолжается выполнение программы после «выброса» исключения.

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

Заключение

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

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

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

Обработка исключений, может свести возникновение аварий в коде к минимуму, однако разработчику все равно следует быть предельно внимательным при написании программ.

Список использованной литературы

1. Орлов, С. А. Теория и практика языков программирования: Учебник для вузов. Стандарт 3-его поколения. - Спб.: Питер, 2013. - 688 с.

2. Страуструп, Б. Язык программирования С++. Специальное издание./ Б. Страуструп. - 3-е изд., - М.: Бином, 2008. - 1136 с.

3. Шилдт, Г. С++: базовый курс. / Г. Шилдт. - 3-е изд., - М. : Издательский дом «Вильямс», 2010. - 624с.

4. Компиляторы: принципы, технологии и инструментарий./А. Ахо, М. Лам, Р. Сети, Д. Ульман. -- 2-е изд., -- М.: Издательский дом «Вильямс», 2008. - 1184 с.

5. Виллемер А. Программирование на С++./А. Виллемер. - М.: Эксмо, 2013. - 528 с.

Эту работу написала Егорова Александра, студентка МТУ МИРЭА гр. ККСО-1-15 2016 г. Она очень устала.

Приложения

1. Оператор языка программирования С++, преобразующий операнд expression в объект типа type-id.

dynamic_cast <type-id> (expression);

2. bitset - специальный класс-контейнер, который предназначен для хранения битовых значений.

operator[] - перегруженный оператор квадратных скобок, для организации непосредственного доступа к битам;

to_ulong - преобразовать битовый объект в целое длинное беззнаковое значение;

3. ios_base - класс, описывающий хранилище и функции-члены общие для обоих потоков (ввода и вывода), независящих от параметров шаблона.

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

Размещено на Allbest.ru


Подобные документы

  • Коды, обрабатывающие исключения, информация о причине их возникновения. Способы обработки исключений. Механизмы обработки исключений. Инициализация ссылки на объект. Конструкторы стандартных исключений. Автоматическая и программная генерации исключений.

    презентация [126,1 K], добавлен 21.06.2014

  • Обработка прерываний - сигналов о совершении некоторых событий в компьютере. Механизм обработки прерываний. Обработка исключений, описание реакции программы на ошибки выполнения. Общее понятие и виды исключительных ситуаций во время выполнения программы.

    реферат [192,2 K], добавлен 10.11.2014

  • Предотвращение или выявление ошибочных ситуаций в ходе выполнения программы. Стандартная обработка исключений, программные средства. Назначение программных блоков try, catch, final. Главные особенности конфигурирования исключений с помощью флажков.

    лекция [387,6 K], добавлен 09.12.2013

  • Понятие и общая характеристика языка программирования РНР, принципы и этапы его работы, синтаксис и ассоциируемые массивы. Обработка исключений в языке Java. Работа с базами данных с помощью JDBC. Изучение порядка разработки графического интерфейса.

    презентация [192,3 K], добавлен 13.06.2014

  • Виртуальные функции, статические и абстрактные классы, шаблоны: элементы и члены класса, их роль в объектно-ориентированном программировании; механизм осуществления виртуального вызова при выполнении программы; обработка исключительных ситуаций в C++.

    реферат [27,2 K], добавлен 06.12.2010

  • Определение пакета, его хранение и импортирование. Спецификаторы доступа Jаvа, управление ими. Модификатор static, наложение ограничений. Использование абстрактных классов. Модификатор final в сочетании с наследованием. Обработка исключений Exception.

    презентация [358,1 K], добавлен 26.10.2013

  • Режимы компьютерной обработки данных. Централизованный, децентрализованный, распределенный и интегрированный способы обработки данных. Средства обработки информации. Типы ведения диалога, пользовательский интерфейс. Табличный процессор MS Excel.

    курсовая работа [256,9 K], добавлен 25.04.2013

  • Основные этапы разработки игровой системы "Тетрис", создание игр "Стройка" и "Гонки" на основе тетриса в трех режимах сложности: сложный, средний, легкий. Особенности контейнеров, итераторов, обработка исключений, описание основных классов и алгоритмов.

    курсовая работа [1,4 M], добавлен 22.06.2012

  • Создание игровой системы "Тетрис": количество игр, режимы сложности, интерфейс пользователя, игровая статистика, обработка исключений. Структура входных и выходных данных. Диаграммы и описание классов. Блок-схема алгоритма программы, результаты ее работы.

    курсовая работа [1,9 M], добавлен 13.06.2012

  • Объектно-ориентированное программирование в Java. Базовый класс Object – сравнение, описание, разрушение, строковое представление объектов, их синхронизация. Неизменяемые строки в Java – класс String. Работа с массивами. Конструкция try-catch-finally.

    лекция [306,3 K], добавлен 01.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.