Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не 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 (обозначающим ошибку, возникающую в момент выполнения программы) мы порождаем принудительно, передавая конструктору объекта — индикатора исключения строку с описанием подробностей.