Полезная вещь, наверное
От: Chez Россия  
Дата: 06.10.05 14:08
Оценка:
По мотивам топика подход к try-catch
Автор:
Дата: 05.10.05

накидал одну функцию...

Мне кажется она может быть полезной:
#include <exception>

template<typename _ExCatchAs>
inline bool get_exception()
{
    bool result = false;
    try
    {
        throw;
    }
    catch(_ExCatchAs _e)
    {
        result = true;
    }
    catch(...)
    {
        result = false;
    }

    return result;
}

template<typename _ExCatchAs, typename _ExType>
inline bool get_exception(_ExType* pex/* = NULL*/)
{
    bool result = false;
    try
    {
        throw;
    }
    catch(_ExCatchAs _e)
    {
        if (pex)
        {
            *pex = _e;
        }

        result = true;
    }
    catch(...)
    {
        result = false;
    }

    return result;
}

template<typename _ExCatchAs, typename _ExType, class _Predicate>
inline bool get_exception(_ExType* pex/* = NULL*/, _Predicate pred)
{
    bool result = false;
    try
    {
        throw;
    }
    catch(_ExCatchAs _e)
    {
        if (pred(_e))
        {
            if (pex)
            {
                *pex = _e;
            }

            result = true;
        }
    }
    catch(...)
    {
        result = false;
    }

    return result;
}
Смысл: проверить и/или получить некое исключение — исполняется оно в данный момент или нет.
Ограничения: функция может быть вызвана только в контексе catch-блока. Иначе будет вызван обработчик "unexpected".
Протестировано на VC7.


Гораздо более интересные вещи можно было бы творить временно подменяя обработчики unexpected и terminate. Но в ходе экспериментов к своему сожалению я выяснил, что такие полезные функции как
set_unexpected
set_terminate
uncaught_exception
в VC6 и в VC7 не работают.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Phlebotomized — Devoted To God

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