Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 10:

Объектно-ориентированное программирование

10.5.5 Стандартные классы — индикаторы исключений

Стандартная библиотека C++ содержит иерархию стандартных классов- индикаторов исключений (рис. 10.5), объявленных в заголовочном файле stdexcept. Эти индикаторы можно использовать в собственных программах.

Предопределённые индикаторы исключений

увеличить изображение
Рис. 10.5. Предопределённые индикаторы исключений

Назначение каждого класса-индикатора представлено в табл. 10.3.

Таблица 10.3. Стандартные классы-индикаторы исключений
Исключение Описание
exception базовый класс для всех стандартных исключений C++
bad_alloc неудача выделения памяти; может генерироваться оператором new
bad_cast ошибка динамического приведения типов, генерируется dynamic_cast
bad_exception предназначено для обработки непредусмотренных исключений в программе
bad_typeid генерируется оператором typeid (оператор, возвращающий имя типа, которому принадлежит аргумент), если не удаётся определить тип объекта
logic_error исключение, связанное с ошибкой в логике работы программы, которая, теоретически, может быть обнаружена при чтении кода
domain_error генерируется при выходе из математической области допустимых значений
invalid_argument генерируется при получении недопустимого аргумента
length_error генерируется при попытке создания слишком длинной строки
out_of_range выход индекса за допустимую границу
runtime_error исключение, связанное с ошибкой, которая, теоретически, не может быть обнаружена при чтении кода
overflow_error генерируется при обнаружении математического переполнения
range_error генерируется при попытке сохранить значение, выходящее за границы допустимого диапазона
underflow_error генерируется при математической ошибке исчезновения порядка

Базовый класс exception содержит конструктор по умолчанию, конструктор копирования, деструктор, перегруженный оператор присваивания, а также единственный метод what(), возвращающий ASCIIZ-строку с человеко-читаемым описанием исключительной ситуации. Классы-потомки могут добавлять к этому свой собственный функционал, в зависимости от типа ошибок, для обработки которых они предназначены. Однако стандартные классы-индикаторы по существу являются простыми обёртками над exception, ограничиваясь возможностью указать конструктору класса-индикатора сообщение, которое должен возвращать метод what().

Воспользуемся в следующем примере двумя стандартными классами- индикаторами:

  • выбрасываемым автоматически при выходе индекса за пределы строки (воспользуемся классом string из стандартной библиотеки);
  • выбрасываемым при ошибке в ходе выполнения (соответствующее исключение будем генерировать сами).
#include <string>
#include <stdexcept>
#include <iostream>
using namespace std;
int main ( )
{
	//перехват выхода индекса за границу массива:
	try
	{
		string s ("sdf");
		s.replace (100, 1, 1, "c");
	}
	catch ( out_of_range &e )
	{
		cout << "Обнаружен выход индекса за границу массива: " << e.what ( ) << endl;
	}
	catch ( exception &e )
	{
		cout << "Обнаружена ошибка неопределённого вида: " << e.what ( ) << endl;
	}
	catch (...)
	{
		cout << "Неизвестная ошибка\n ";
	}
	//перехват ошибки, возникающей в момент выполнения:
	try
	{
		throw run time_error ( "ошибка в ходе выполнения" );
	}
	catch ( run time_error &e )
	{
		cout << "Обнаружена ошибка при выполнении программы: " << e.what ( ) << endl;
	}
	catch ( exception &e )
	{
		cout << "Обнаружена ошибка неопределённого вида: " << e.what ( ) << endl;
	}
	catch (...)
	{
		cout << "Неизвестная ошибка\n ";
	}
	return 0;
}

В первом случае исключение с индикатором out_of_range генерируется автоматически, когда мы допускаем выход индекса за границу строки (такая возможность реализована классом string из стандартной библиотеки). Во втором случае исключительную ситуацию с индикатором runtime_error (обозначающим ошибку, возникающую в момент выполнения программы) мы порождаем принудительно, передавая конструктору объекта — индикатора исключения строку с описанием подробностей.

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?