Одни конструкции try-catch
могут содержать другие. Если исключение возникает во вложенной конструкции try-catch, то программа сначала ищет во вложенной конструкции
блок catch, который обрабатывает нужный тип исключения. Если во вложенной конструкции try-catch такой блок catch не найден, то программа начинает искать аналогичный блок catch во внешей
конструкии try-catch. Посмотрим на примере.
#include <iostream> double divide(int a, int b) { if(!b) // если b == 0 { throw "Division by zero"; } return a / b; } int main() { try { try { int a{10}, b{}; double result {divide(a, b)}; std::cout << result << std::endl; } catch (const char* error) { std::cout << "Inner execption: " << error << std::endl; } std::cout << "Inner try-catch finished" << std::endl; } catch (const char* error) { std::cout << "External execption: " << error << std::endl; } std::cout << "External try-catch finished" << std::endl; }
Здесь функция divide()
вызывается во внутренней конструкции try-catch. Оператор throw генерирует исключение, объект которого представляет строковый литерал - тип const char*
.
Во вложенной конструкции try-catch есть такой блок catch, который обрабатывает исключения типа const chat*
. И выполнения этого блока catch программа продолжает свой
обычный ход работы, а блок catch во внешей конструкции try-catch НЕ выполняется. В итоге будет следующий консольный вывод:
Inner execption: Division by zero Inner try-catch finished External try-catch finished
Теперь возьмем другую ситуацию - во вложенной конструкции try-catch нет нужного блока catch:
#include <iostream> double divide(int a, int b) { if(!b) // если b == 0 { throw "Division by zero"; } return a / b; } int main() { try { try { int a{10}, b{}; double result {divide(a, b)}; std::cout << result << std::endl; } catch (unsigned error) { std::cout << "Inner execption: " << error << std::endl; } std::cout << "Inner try-catch finished" << std::endl; // эта строка не выполняется } catch (const char* error) { std::cout << "External execption: " << error << std::endl; } std::cout << "External try-catch finished" << std::endl; }
Фактически это тот же самый пример, только теперь блок catch во вложенной конструкции обрабатывает исключения типа unsigned
. В итоге, когда будет сгенерировано исключение,
вложенная конструкция не сможет найти нужный блок catch для обработки исключения типа const char*
. Поэтому выполнение выполнение программы переходит в блок
catch внешней конструкции try-catch
, который обрабатывает исключения типа const char*
. Поэтому консольный вывод будет другим
External execption: Division by zero External try-catch finished