Полезная вещь, наверное
От: 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

Re: Полезная вещь, наверное
От: 0xDEADBEEF Ниоткуда  
Дата: 06.10.05 21:51
Оценка:
Здравствуйте, Chez, Вы писали:

C>в VC6 и в VC7 не работают.

...Чай не мы одни исходники RTL курили...

А еще, могут быть полезны вот такие извраты (нигде не использовались, так что проверять на сжатие и растяжение, а также подвергать нещадной критике).

template<class T, class Filter>
class Something {
   Filter filter_;
public:
   X theMethod()
   { 
       try {
            T::DoSomethingDubious();//сделать что-то сомнительное 
               //(а не "дубовое", как вы могли подумать)
       } catch(...) {
            filter_();
       }
   }
};
__________
16.There is no cause so right that one cannot find a fool following it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.