Одни конструкции 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