Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

1. Особенности обработки исключительных ситуаций с использованием функции abort() и exit(). Преимущества и недостатки. Примеры использования.

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

Один из способов выхода из исключительной ситуации – вызов функции abort(). В основной реализации функции abort() в стандартный поток ошибок (cerr) отправляется сообщение “ abnormal program termination”. Кроме того в ОС или родительскому процессу возвращается значение, обозначающее аварийной завершение. Функция abort() может выводить содержимое файловых буферов (области памяти, использующейся для хранения данных при работе с файлами).

Функция abort() вызывает немедленное прекращение программы. Очистка буферов файлов не про­изводится.

double div(double divisible, double divisor) {

if (divisor == 0) abort();

return divisible / divisor;

}

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

Функция exit() вызывает немедленное нормальное завершение программы. Значение параметра status задается вызывающим процессом. По соглашению, если значением параметра status является 0, то предполагается нормальное завершение программы. Ненулевое значение используется для указания ошибки, зависящей от реализации. Также можно использовать макросы EXIT_SUCCESS И EXIT_FAILURE в качестве значения параметра status. Они указывают на нормальное и ненор­мальное завершение программы соответственно. Вызов функции exit() осуществляет очистку буфе­ров файлов, закрывает все открытые файлы и затем вызывает зарегистрированные с помощью функции atexit() терминальные функции.

double div(double divisible, double divisor) {

if (divisor == 0) exit(-1);

return divisible / divisor;

}

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

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

Возврат функцией кода ошибки является самым обычным и широко

применяемым методом. Однако этот метод имеет существенные недостатки.

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

проблему можно обойти, используя перечисляемые типы. Но в некоторых

случаях функция может возвращать широкий диапазон допустимых

(неошибочных) значений, и тогда сложно найти диапазон для возвращаемых

кодов ошибки. Это и является вторым недостатком. И, в-третьих, при

использовании такого механизма сигнализации об ошибках вся

ответственность по их обработке ложится на программиста и могут

возникнуть ситуации, когда серьезные ошибки могут остаться без внимания.

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

Исключения (exception) – это возникновение непредвиденных условий,

аномалии времени выполнения, например, деление на ноль, невозможность

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

данных или ввод непредвиденных данных (типов данных), которые

нарушают нормальное функционирование программы. Обычно эти условия

завершают выполнение программы с системной ошибкой. Язык С++

позволяет восстанавливать программу из этих условий и продолжать ее

выполнение. В то же время исключение – это более общее, чем ошибка,

понятие и может возникать и тогда, когда в программе нет ошибок.

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

это объект системного или пользовательского класса, создаваемого

операционной системой или кодом программы в ответ на обстоятельства,

либо не допускающие дальнейшего нормального выполнения программы,

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

позволяет корректно выйти из затруднительной ситуации.

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

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

справиться, причем проблема такова, что обнаружившая ее часть программы

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

участок программы нуждается в способе сообщить о случившемся и о том,

что он неспособен продолжить выполнение. Способ сообщения о проблеме

не подразумевает знания о том, какая именно часть программы будет

справляться с создавшейся ситуацией. Сообщив о случившемся,

обнаружившая проблему часть кода прекращает работу.

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

соответствует другая часть, код которой способен обработать исключение,

независимо от того, что произошло. Например, если проблема в

недопустимом вводе, то часть кода обработки могла бы попросить

пользователя ввести правильные данные. Если потеряна связь с базой

данных, то часть кода обработки могла бы предупредить об этом

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

обнаруживающих проблему и решающих ее.

Обработка исключительных ситуаций лишена недостатков

вышеназванных методов реагирования на ошибки. Этот механизм

позволяет использовать для представления информации об ошибке

объект любого типа. Поэтому можно, например, создать иерархию классов,

которая будет предназначена для обработки различных типов аварийных

событий. Это упростит, структурирует и сделает программу более понятной.

Обработка исключений в языке C++ подразумевает следующее.

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

которой он не может справиться. Об операторе throw говорят, что он

передает, генерирует (raise) исключение. Блок try начинается с ключевого

слова try и завершается одной или несколькими директивами catch (catch

clause). Исключения, переданные из кода, расположенного в блоке try, как

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

обрабатывают исключение, их называют также обработчиками исключений

(exception handler). Набор определенных в библиотеке классов исключений

(exception class) используется для передачи информации о произошедшем

событии между операторами throw и соответствующими разделами catch.

#include<iostream>

using namespace std;

double div(double divisible, double divisor) {

if (divisor == 0) throw 1;

return divisible / divisor;

}

int main() {

double quotient;

try {

quotient = div(77., 0.);

cout << "Quotient is " << quotient << endl;

}

catch (int) { cout << "Division by zero" << endl; }

return 0;

}