Автор: Толик
Головной раздел: Меню
Вопрос 19. Понятие особой (исключительной) ситуации в Си++. Общий формат обработки исключительных ситуаций (ключевые слова: try, catch, throw).
Исключительная ситуация - тот момент, когда дальнейшее выполнение программы невозможно.
Обработка исключений, возбужденных оператором throw, идет по следующей схеме:
- Создается статическая переменная со значением, заданным в операторе throw. Она будет существовать до тех пор, пока исключение не будет обработано. Если переменная-исключение является объектом класса, при ее создании работает конструктор копирования.
- Завершается выполнение защищенного try-блока: раскручивается стек подпрограмм, вызываются деструкторы для тех объектов, время жизни которых истекает и т.д.
- Выполняется поиск первого из catch-блоков, который пригоден для обработки созданного исключения.
Общий формат описан ниже
Вопрос 20. Обработка исключения внутри функции, в которой сгенерировано исключение (ключевые слова: try, catch, throw), пример.
void exceptionFunction()
{
try {
// Что-то делаем и вдруг
throw std::length_error("Text");
} catch (std::length_error &e) {
std::cout << "Captured" << std::endl;
}
}Вопрос 21. Обработка исключения вне функции, в которой сгенерировано исключение, объявление функции, в которой генерируются исключения (ключевые слова: try, catch, throw), пример.
void exceptionFunction()
{
// Что-то делаем
// Возможна генерация std::length_error, std::out_of_range и каких-либо других исключений,
// надклассом которых является std::exception
}
int main()
{
try {
exceptionFunction();
} catch (std::length_error &e) {
std::cout << "Length error: " << e.what() << std::endl;
} catch (std::out_of_range &e) {
std::cout << "Out of range: " << e.what() << std::endl;
} catch (std::exception &e) {
std::cout << "Other exception: " << e.what() << std::endl;
}
}Вопрос 22. Создание исключения как объекта класса в Си++ (ключевые слова: try, catch, throw), пример.
std::length_error("Text"); // Создание исключения как объекта классаtry обозначает начало блока с возможным выборосом исключения
catch( ) обозначает начало блока с обработкой исключений
throw выкидывает исключение
catch (std::exception &e) // Ловим определенное исключение по его классу или надклассуcatch (...) // Ловим любое исключениеТакже никто не запрещает бросать вместо исключения какой-нибудь int или std::mutex. Соответственно, для их ловли второй вариант подходит без изменений, а в первом придётся заменить тип.
throw std::out_of_range("Информативная информация"); // Выкидывание// Перешлет существующее исключение, либо
// SIGABRT приведет к аварийному закрытию программы
throw;| Класс | Описание |
|---|---|
| std::exception | Базовый класс |
| std::runtime_error | Ошибка времени выполнения |
| std::logic_error | Логическая ошибка |
| Класс | Описание |
|---|---|
| std::out_of_range | Выход за границу |
| std::length_error | Нарушен предел длины |
| std::bad_alloc | Не смогли аллоцировать память |
| std::bad_cast | Ошибка преобразования ссылок в dynamic_cast |
Вопрос 26. Обработка исключений в стандартной библиотеке Си++: создание своего класса исключения на основе класса std::exception, пример.
Обработка исключений производится с помощью конструкции try { ... } catch ( ... ) { ... }
// Свое исключение
class MyException: public std::exception
{
public:
const char *what() const noexcept override
{
return "My exception raised!";
}
};
// Где-то в коде
try {
myFunction(); // Пусть эта функция может выбросить MyException
} catch (const MyException &e) {
// Либо можно ловить ``const std::exception &e`` так как это надкласс
std::cout << e.what() << std::endl;
}