Вложенные try-catch

Последнее обновление: 17.03.2023

Одни конструкции 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850