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

  Юрий  | 

    | 

  Обновл. 28 Июн 2019  | 

 2185

 ǀ   6 

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

Теория

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

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

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

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

Блоки catch могут обрабатывать исключения определённого типа данных, или сразу всех типов данных — так называемые «обработчики catchall», в которых эллипсис (…) указывается в качестве типа исключения. Блок 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 (18 оценок, среднее: 4,78 из 5)
Загрузка...

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

  1. Аватар Илья:

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

  2. Аватар kmish:

    Моя версия:

  3. Аватар Римма:

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

    1. Юрий Юрий:

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

      Пожалуйста 🙂

  4. Аватар Сергей:

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

    1. Юрий Юрий:

      Пожалуйста 🙂

Добавить комментарий

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