Глава №14. Итоговый тест

  Юрий  | 

  |

  Обновл. 1 Ноя 2020  | 

 17358

 ǀ   8 

Вот мы и прошли тему «Исключения в языке С++», пора закрепить полученные знания.

Оглавление:

Теория

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

Оператор throw используется для выбрасывания (генерации) исключения. Блоки try ловят исключения, которые выбрасываются в их пределах, и перенаправляют пойманные исключения блокам catch. Если тип исключения совпадает с типом обработчика catch, обработчик catch обрабатывает пойманное исключение.

Исключения обрабатываются немедленно. Если исключение было выброшено, то точка выполнения переходит к ближайшему блоку try в поисках обработчика catch, который сможет обработать сгенерированное исключение. Если блок try не был найден или тип блока catch не совпал, то стек начнет раскручиваться до тех пор, пока не будет найден соответствующий обработчик catch. Если стек полностью раскручен, а обработчик catch так и не найден, то программа завершит свое выполнение с ошибкой необработанного исключения.

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

Блоки catch могут обрабатывать исключения определенного типа данных или сразу всех типов данных — так называемые «обработчики catch–all», в которых эллипсис () указывается в качестве типа исключения. Блок catch, принимающий объект родительского класса по ссылке, также будет перехватывать и объекты дочерних классов. Все исключения, выбрасываемые Стандартной библиотекой С++, являются дочерними классу-исключению std::exception (который находится в заголовочном файле exception), поэтому блок catch, принимая std::exception по ссылке, также будет обрабатывать все остальные исключения, генерируемые Стандартной библиотекой С++. Метод what() используется для конкретизации того, какой тип std::exception был выброшен.

Внутри блока catch может генерироваться новое исключение. Поскольку это новое исключение выбрасывается за пределами блока try, связанного с этим блоком catch, то оно не будет перехвачено текущим блоком catch (в котором выброшено). Исключения можно повторно выбрасывать в блоке catch с помощью ключевого слова throw без указания какого-либо идентификатора. Не выбрасывайте повторно пойманное блоком catch исключение (объект класса-исключения), дабы избежать обрезки объекта.

Функциональные try-блоки используются для расположения обработчика исключений вокруг всего тела функции, а не только вокруг её определенной части (блока кода). Обычно они используются только с конструкторами дочерних классов.

Никогда не выбрасывайте исключения внутри деструкторов.

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

Тест


Напишите класс Fraction, конструктор которого принимает числитель и знаменатель. Если пользователь передал в качестве знаменателя 0, то выбрасывайте исключение типа std::runtime_error (которое находится в заголовочном файле stdexcept). В функции main() попросите пользователя ввести два целых числа. Если числа, которые ввел пользователь, корректные, то выводите создаваемый объект класса Fraction. Если же числа недопустимые, то вы должны обрабатывать исключение типа std::exception и сообщить пользователю, что он ввел некорректные данные.

Подсказка: std::runtime_error является дочерним классу-исключению std::exception, поэтому у вас должен быть только один блок catch.

Пример выполнения программы:

Enter the numerator: 7
Enter the denominator: 0
Your fraction has an invalid denominator.

Ответ

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (113 оценок, среднее: 4,90 из 5)
Загрузка...

Комментариев: 8

  1. Руслан:

    моя версия

  2. Илья:

    Моя версия:
    unique_ptr лучше юзать ВСЕГДА

    1. test:

      Здесь явно лучше не использовать указатели. Нету выделения ресурсов, которые нужно очищать.

  3. kmish:

    Моя версия:

  4. Римма:

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

    1. Фото аватара Юрий:

      Привет, починил.

      Пожалуйста 🙂

  5. Сергей:

    Ну, Автору огромное спасибо за его работу! Очень надеюсь, что сайт и далее будет развиваться! Еще раз — спасибо!!!

    1. Фото аватара Юрий:

      Пожалуйста 🙂

Добавить комментарий для Юрий Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *