Смело бросая исключение из дтора - PullRequest
1 голос
/ 06 июля 2019

В C ++> = 11 возможно ли безопасно генерировать исключение из деструктора, т. Е. Выбрасывать его, только если исключение уже не активно?

Я пытался:

#include <exception>
#include <stdexcept>
#include <stdio.h>
struct foo{
    foo();
    ~foo() noexcept(false);
};
foo::foo() { }
foo::~foo() noexcept(false)
{
    if (nullptr==std::current_exception())
       throw 2;
}
int main()
{
    try{
        struct foo f;
#if 1
        throw 1;
#endif
    }catch(int X){
        printf("ex=%d\n", X);
    }
}

без успеха.Я неправильно использую функцию std::current_exception?

Я бы хотел получить ex=1, если включена часть throw 1;, и ex=2 в противном случае.

В настоящее время я получаюterminate called after throwing an instance of 'int' несмотря на проверку if, которая, как мне кажется, должна была предотвратить второй бросок, когда исключение было уже активным.

1 Ответ

3 голосов
/ 06 июля 2019

Вы ищете std::uncaught_exceptions.

std::current_exception возвращает указатель на исключение , которое в данный момент обрабатывается (то есть в блоке catch).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...