0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: c++, исключения, exception, типы</p>
1
<p>Теги: c++, исключения, exception, типы</p>
2
<p>В языке программирования C++ существует не только тип<strong>exception</strong>, но и ряд производных типов исключений. Использоваться они могут в разных ситуациях. Рассмотрим эти типы подробнее: •<strong>runtime_error</strong>: это общий тип исключений, возникающих в процессе выполнения; •<strong>range_error</strong>: это исключение возникает, если полученный результат превосходит определенный допустимый диапазон; •<strong>overflow_error</strong>: когда полученный результат превышает допустимый диапазон; •<strong>underflow_error</strong>: когда полученный по итогу вычислений результат имеет недопустимые отрицательные значения; •<strong>logic_error</strong>: возникает в случае появления логических ошибок в программном коде; •<strong>domain_error</strong>: возникает, когда для какого-нибудь значения, которое передается в функцию, результат не определен; •<strong>invalid_argument</strong>: возникает в процессе передаче некорректного аргумента в функцию; •<strong>length_error</strong>: появляется в случае попытки создать объект большего размера, чем это допустимо для данного типа; •<strong>out_of_range</strong>: появляется при попытке доступа к элементам, которые отсутствуют в допустимом диапазоне.</p>
2
<p>В языке программирования C++ существует не только тип<strong>exception</strong>, но и ряд производных типов исключений. Использоваться они могут в разных ситуациях. Рассмотрим эти типы подробнее: •<strong>runtime_error</strong>: это общий тип исключений, возникающих в процессе выполнения; •<strong>range_error</strong>: это исключение возникает, если полученный результат превосходит определенный допустимый диапазон; •<strong>overflow_error</strong>: когда полученный результат превышает допустимый диапазон; •<strong>underflow_error</strong>: когда полученный по итогу вычислений результат имеет недопустимые отрицательные значения; •<strong>logic_error</strong>: возникает в случае появления логических ошибок в программном коде; •<strong>domain_error</strong>: возникает, когда для какого-нибудь значения, которое передается в функцию, результат не определен; •<strong>invalid_argument</strong>: возникает в процессе передаче некорректного аргумента в функцию; •<strong>length_error</strong>: появляется в случае попытки создать объект большего размера, чем это допустимо для данного типа; •<strong>out_of_range</strong>: появляется при попытке доступа к элементам, которые отсутствуют в допустимом диапазоне.</p>
3
<p>Основная часть этих типов определена в<strong>stdexcept</strong>(заголовочном файле), за исключением класса<strong>bad_alloc</strong>, определяемом в new-файле, и класса<strong>bad_cast</strong>, определяемом в файле<em>type_info</em>.</p>
3
<p>Основная часть этих типов определена в<strong>stdexcept</strong>(заголовочном файле), за исключением класса<strong>bad_alloc</strong>, определяемом в new-файле, и класса<strong>bad_cast</strong>, определяемом в файле<em>type_info</em>.</p>
4
<p>Однако в отличие от классов<strong>exception, bad_cast и bad_alloc</strong>, в конструкторы прочих типов вы можете передать строку, передав таким образом сообщение об ошибке.</p>
4
<p>Однако в отличие от классов<strong>exception, bad_cast и bad_alloc</strong>, в конструкторы прочих типов вы можете передать строку, передав таким образом сообщение об ошибке.</p>
5
<p>Что касается конструкции<strong>try...catch</strong>, то тут можно применять несколько блоков<strong>catch</strong>в целях обработки разных типов исключений. А в случае появления исключения для его обработки выберется как раз тот, который использует тип возникшего исключения.</p>
5
<p>Что касается конструкции<strong>try...catch</strong>, то тут можно применять несколько блоков<strong>catch</strong>в целях обработки разных типов исключений. А в случае появления исключения для его обработки выберется как раз тот, который использует тип возникшего исключения.</p>
6
<p>Когда применяется несколько блоков catch, сначала помещают блоки<strong>catch</strong>, обрабатывающие более частные исключения, и лишь потом те блоки<strong>catch</strong>, которые имеют более общие типы исключений:</p>
6
<p>Когда применяется несколько блоков catch, сначала помещают блоки<strong>catch</strong>, обрабатывающие более частные исключения, и лишь потом те блоки<strong>catch</strong>, которые имеют более общие типы исключений:</p>
7
<p>В нашем примере функция<strong>divide</strong>выбрасывает исключение типа<strong>runtime_error</strong>, когда параметр b равен 0. Инициализация такого исключения происходит с помощью сообщения об ошибке "<em>Division by zero!</em>".</p>
7
<p>В нашем примере функция<strong>divide</strong>выбрасывает исключение типа<strong>runtime_error</strong>, когда параметр b равен 0. Инициализация такого исключения происходит с помощью сообщения об ошибке "<em>Division by zero!</em>".</p>
8
<p>Идем дальше: в функции main конструкция<strong>try..catch</strong>задействует 3 блока<strong>catch</strong>, при этом последний блок представляет, по сути, наиболее общий тип исключений<strong>exception</strong>. Второй блок выполняет обработку исключений типа<strong>runtime_error</strong>(производное от<strong>exception</strong>), а первый - обработку исключений типа<strong>overflow_error</strong>(производное от<strong>runtime_error</strong>).</p>
8
<p>Идем дальше: в функции main конструкция<strong>try..catch</strong>задействует 3 блока<strong>catch</strong>, при этом последний блок представляет, по сути, наиболее общий тип исключений<strong>exception</strong>. Второй блок выполняет обработку исключений типа<strong>runtime_error</strong>(производное от<strong>exception</strong>), а первый - обработку исключений типа<strong>overflow_error</strong>(производное от<strong>runtime_error</strong>).</p>
9
<p>Кроме того, все типы исключений имеют метод what(), возвращающий информацию об ошибке. В результате программа выдаст следующее:</p>
9
<p>Кроме того, все типы исключений имеют метод what(), возвращающий информацию об ошибке. В результате программа выдаст следующее:</p>
10
<p><em>По материалам https://metanit.com/cpp/.</em></p>
10
<p><em>По материалам https://metanit.com/cpp/.</em></p>
11
11