|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Объектно-ориентированное программирование
10.5.5 Стандартные классы — индикаторы исключений
Стандартная библиотека C++ содержит иерархию стандартных классов- индикаторов исключений (рис. 10.5), объявленных в заголовочном файле stdexcept. Эти индикаторы можно использовать в собственных программах.
Назначение каждого класса-индикатора представлено в табл. 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 (обозначающим ошибку, возникающую в момент выполнения программы) мы порождаем принудительно, передавая конструктору объекта — индикатора исключения строку с описанием подробностей.
