Хотите разобраться в сложных темах 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: появляется при попытке доступа к элементам, которые отсутствуют в допустимом диапазоне.
Основная часть этих типов определена в stdexcept (заголовочном файле), за исключением класса bad_alloc, определяемом в new-файле, и класса bad_cast, определяемом в файле type_info.
Однако в отличие от классов exception, bad_cast и bad_alloc, в конструкторы прочих типов вы можете передать строку, передав таким образом сообщение об ошибке.
Что касается конструкции try...catch, то тут можно применять несколько блоков catch в целях обработки разных типов исключений. А в случае появления исключения для его обработки выберется как раз тот, который использует тип возникшего исключения.
Когда применяется несколько блоков catch, сначала помещают блоки catch, обрабатывающие более частные исключения, и лишь потом те блоки catch, которые имеют более общие типы исключений:
В нашем примере функция divide выбрасывает исключение типа runtime_error, когда параметр b равен 0. Инициализация такого исключения происходит с помощью сообщения об ошибке "Division by zero!".
Идем дальше: в функции main конструкция try..catch задействует 3 блока catch, при этом последний блок представляет, по сути, наиболее общий тип исключений exception. Второй блок выполняет обработку исключений типа runtime_error (производное от exception), а первый — обработку исключений типа overflow_error (производное от runtime_error).
Кроме того, все типы исключений имеют метод what(), возвращающий информацию об ошибке. В результате программа выдаст следующее:
По материалам https://metanit.com/cpp/.