getter of pointer to nested exception from exception_ptr to containing object

Antervis
Antervis

На данный момент единственный способ получить вложенное исключение - std::rethrow_if_nested. У этого подхода есть два недостатка:

1. Обработка вложенных исключений в одном try-catch блоке возможно только при использовании рекурсии

2. Нет возможности напрямую поднять вложенное исключение, используя std::exception_ptr.

 

Желаемого функционала можно добиться примерно следующим образом:

std::exception_ptr nested_exception_of(std::exception_ptr eptr) {
    try {
        std::rethrow_exception(eptr);
    } catch (std::exception &e) {
        try {
            std::rethrow_if_nested(e);
            return std::exception_ptr();
        } catch (...) {
            return std::current_exception();
        }
    }
}

Недостатки:

1. на обработку каждого исключения понадобится три try-catch блока

2. необходимо явно указать все (хотя бы) базовые типы для исключений в приложении

3. такой подход не поддерживает объекты исключений, не являющиеся ни полиморфными, ни наследниками от std::nested_exception

 

Что это даст:

В стандартной библиотеке появится возможность обрабатывать вложенные исключения не рекурсивно, а в цикле (в дополнение можно будет легко написать forward iterator/range для вложенных исключений). Примерно следующим образом:

try {
    try {
        new int[100000][10000];
    } catch (...) {
        std::throw_with_nested(std::runtime_error("test error"));
    }
} catch (...) {
    for (auto e = std::current_exception(); e; e = nested_exception_of(e)) {
        try {
            std::rethrow_exception(e);
        } catch (std::runtime_error &e) {
            std::cout << "runtime error: " << e.what() << std::endl;
        } catch (std::bad_alloc &e) {
            std::cout << "bad alloc: " << e.what() << std::endl;
        }
    }
}
4
рейтинг
1 комментарий
yndx-antoshkka
не уверен в том, насколько std::nested_exception популярное решение. Но желающим помогу с написанием proposal.
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).