Исключения
От: LaptevVV Россия  
Дата: 02.07.24 19:55
Оценка: :)
В catch не выполняется преобразование типов для параметра.
А как с принципом подстановки ?
Раньше не работал.
То есть нельзя было сгенерить исключение производного типа, а ловить catch'em с параметром базового типа.
А сейчас ничего не изменилось ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Исключения
От: andrey.desman  
Дата: 02.07.24 20:12
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>В catch не выполняется преобразование типов для параметра.

LVV>А как с принципом подстановки ?
LVV>Раньше не работал.
LVV>То есть нельзя было сгенерить исключение производного типа, а ловить catch'em с параметром базового типа.

Не помню такого. Вроде всегда можно было и никто особо на эту тему не баговал.

LVV>А сейчас ничего не изменилось ?


Можно резать, можно бить, все равно тебе ловить.

#include <iostream>
#include <exception>

class E: public std::logic_error {
public:
    using logic_error::logic_error;
};

int main() {
    try {
        throw E("bla-bla");
    } catch (std::exception e) {
        std::cout << "caught object slice: " << typeid(e).name() << "\n";
    }

    try {
        throw E("bla-bla");
    } catch (const std::exception& e) {
        std::cout << "caught object ref: " << typeid(e).name() << "\n";
    }

    return 0;
}


caught object slice: St9exception
caught object ref: 1E
Re: Исключения
От: kov_serg Россия  
Дата: 02.07.24 20:13
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>В catch не выполняется преобразование типов для параметра.

LVV>А как с принципом подстановки ?
LVV>Раньше не работал.
LVV>То есть нельзя было сгенерить исключение производного типа, а ловить catch'em с параметром базового типа.

Это почему собственно?
#include <stdio.h>

struct A0 {};
struct A1 : A0 {};
struct A2 : A1 {};

void handle() {
    try { throw; } 
    //catch(A2 &a) { printf("catch A2\n"); } 
    catch(A1 &a) { printf("catch A1\n"); } 
    catch(A0 &a) { printf("catch A0\n"); }
}

int main(int argc, char const *argv[]){
    try {
        printf("test\n");
        throw A2();
    } catch(...) {
        handle();
    }
    return 0;
}

test
catch A1

Или вы о чем-то другом говорите?
Re[2]: Исключения
От: LaptevVV Россия  
Дата: 03.07.24 04:19
Оценка:
_>Или вы о чем-то другом говорите?
Нет, я об этом.
спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Исключения
От: пффф  
Дата: 03.07.24 10:17
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>То есть нельзя было сгенерить исключение производного типа, а ловить catch'em с параметром базового типа.



Как это нельзя, когда льзя? Например, пытаешься ловить std::exception, а ловишь все, которые от него отнаследованы. А если хочешь ловить отдельно какой-нибудь std::out_of_range, то его надо ловить до std::exception
Отредактировано 03.07.2024 10:19 пффф . Предыдущая версия .
Re: Исключения
От: Igore Россия  
Дата: 03.07.24 12:44
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>В catch не выполняется преобразование типов для параметра.

LVV>А как с принципом подстановки ?
LVV>Раньше не работал.
LVV>То есть нельзя было сгенерить исключение производного типа, а ловить catch'em с параметром базового типа.
LVV>А сейчас ничего не изменилось ?
Ничего не менялось. Как вариант ловится раньше, или кидается что то необычное, помню в какой-то стороней библиотеке было throw int, const char*.

#include <iostream>
#include <exception>

class E: public std::logic_error {
public:
    using logic_error::logic_error;
};

int main() {
    try {
        throw E("bla-bla");
    } catch (std::exception e) {
        std::cout << "oops" << std::endl; 
    }
    } catch (E e) {
        std::cout << "caught object slice: " << typeid(e).name() << std::endl;
    }

    try {
        throw 5;
    } catch (const std::exception& e) {
        std::cout << "caught object ref: " << typeid(e).name() << std::endl;
    } catch (...) {
        std::cout << "oops" << std::endl; 
    }

    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.