Re: Исключение в деструкторе
От: elcste  
Дата: 13.11.07 14:41
Оценка: 1 (1)
Здравствуйте, Xchllataa, Вы писали:

Для удобства в формировании сообщений при генерации исключений, написал следующий код
X>#include <iostream>
X>#include <sstream>
X>#include <stdexcept>

X>class Throw
X>{
X>public:
X>    Throw()
X>    {
X>    }

X>    ~Throw()
X>    {
X>        // Здесь предполагается выводить stream.str() в лог

X>        // C4722 'Throw::~Throw' : destructor never returns, potential memory leak
X>        throw std::runtime_error(stream.str());
X>    }

X>    operator std::ostream&() {return stream;}

X>private:
X>    std::ostringstream stream;

X>    Throw(Throw const&);
X>    Throw const& operator=(Throw const&);
X>};

X>// suppress C4127
X>inline bool false_() {return false;}

X>#define DBG_THROW() if (false_()) ; else static_cast<std::ostream&>(Throw()) << '[' << __FUNCTION__ << "] "

int foo(int bar)
{
    if(bar == 0xdeadbeef)
        DBG_THROW() << "Oops...";
    return 42;
}

int main()
{
    try
    {
        DBG_THROW() << "test " << foo(0xdeadbeef);
    }
    catch (std::exception const& e)
    {
        std::cout << e.what() << std::endl;
    }
}

X>Я знаю, что если Throw::~Throw() был вызван в результате другого исключение, то приложение упадёт, но здесь это вроде не проблема

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