В чём разница между catch(имя_типа) и catch(имя_типа <имя_переменной>)?

Всем здравствуйте, решил тут поиграться с блоком try, throw, catch. Написал простенькую программку для решения простых примеров с использованием лямбда-выражения, описал там блок try-catch.

#include <iostream>

int main()
{
    setlocale(LC_ALL, "Russian");
    double a, b;
    char c;
    std::cin >> a >> c >> b;
    auto f = [c](double a, double b)
    {
        if (c == '+') std::cout << a + b;
        if (c == '-') std::cout << a - b;
        if (c == '*') std::cout << a * b;
        if (c == '/')
        {
            try 
            {
                if (b == 0)
                {
                    throw 1;
                }
                std::cout << a / b; 
            }
            catch (int) { std::cout << "Нельзя делить на ноль!"; }
        }
    };
    f(a, b);
    return 0;
}

Тут я при делении проверяю делитель на равенство с нулём и если условие срабатывает то генерирую исключение с числом 1 (тип int). Потом как параметр для catch передаю тип int и всё работает прекрасно, но вопрос состоит в том, что можно было использовать и имя переменной данного типа, например, thr при этом она нигде ранее не была объявлена, а также любую переменную, которая вошла как параметр анонимной функции (если тип данных int, как в параметре catch). От сюда вопрос: в чём разница между простым указанием типа и указанием типа с именем переменной? Что лучше?


Ответы (1 шт):

Автор решения: Harry

Примерно такая же, как если функция описана как

void f(int) { cout << "Какое-то значение"; }

и как

void f(int i) { cout << "значение" << i; }

Вы просто выбрасываете информацию из сгенерированного исключения, только и всего...

Если бы вы написали

... catch(int i) { ... }

то в обработчике i приняла бы (в вашем случае throw 1) значение 1.

→ Ссылка