Найти в Дзене

Типы исключений в C++

Хотите разобраться в сложных темах C++ и прокачать свой скилл до Middle+ уровня? 7 июня Сергей Кольцов, Senior Developer С++ VisionLabs, расскажет, как в этом поможет онлайн-курс «C++ Developer. Professional» от OTUS. Сергей проведет обзор вакансий и требований к C++ разработчикам. Вы узнаете, какие знания и навыки необходимы, чтобы выделиться из толпы и обеспечить себе карьерный прогресс.
Регистрируйтесь на вебинар и готовьте свои вопросы эксперту.

▰▱▰▱▰▱▰▱▰▱▰▱▰▱

В языке программирования C++ существует не только тип exception, но и ряд производных типов исключений. Использоваться они могут в разных ситуациях. Рассмотрим эти типы подробнее:

runtime_error: это общий тип исключений, возникающих в процессе выполнения;

range_error: это исключение возникает, если полученный результат превосходит определенный допустимый диапазон;

overflow_error: когда полученный результат превышает допустимый диапазон;

underflow_error: когда полученный по итогу вычислений результат имеет недопустимые отрицательные значения;

logic_error: возникает в случае появления логических ошибок в программном коде;

domain_error: возникает, когда для какого-нибудь значения, которое передается в функцию, результат не определен;

invalid_argument: возникает в процессе передаче некорректного аргумента в функцию;

length_error: появляется в случае попытки создать объект большего размера, чем это допустимо для данного типа;

out_of_range: появляется при попытке доступа к элементам, которые отсутствуют в допустимом диапазоне.

-2

Основная часть этих типов определена в stdexcept (заголовочном файле), за исключением класса bad_alloc, определяемом в new-файле, и класса bad_cast, определяемом в файле type_info.

Однако в отличие от классов exception, bad_cast и bad_alloc, в конструкторы прочих типов вы можете передать строку, передав таким образом сообщение об ошибке.

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

Когда применяется несколько блоков catch, сначала помещают блоки catch, обрабатывающие более частные исключения, и лишь потом те блоки catch, которые имеют более общие типы исключений:

-3

В нашем примере функция divide выбрасывает исключение типа runtime_error, когда параметр b равен 0. Инициализация такого исключения происходит с помощью сообщения об ошибке "Division by zero!".

Идем дальше: в функции main конструкция try..catch задействует 3 блока catch, при этом последний блок представляет, по сути, наиболее общий тип исключений exception. Второй блок выполняет обработку исключений типа runtime_error (производное от exception), а первый — обработку исключений типа overflow_error (производное от runtime_error).

Кроме того, все типы исключений имеют метод what(), возвращающий информацию об ошибке. В результате программа выдаст следующее:

-4

По материалам https://metanit.com/cpp/.