Определить тип исключения в деструкторе
От: Abulafia  
Дата: 18.05.09 05:57
Оценка:
Пишу трассировщик для проги; перед компиляцией
в каждое тело функции простеньким скриптом
вставляется создание объекта Tracer:

Было:
void someFunc()
{
  doSomethingElse();
}


Стало:
void someFunc()
{
  Tracer _tracer("someFunc()");
  doSomethingElse();
}


В конструкторе -- вывод ">> someFunc()" в лог, в деструкторе -- вывод "<< someFunc()".

Ну, вы знаете. Очевидная и уже тыщщу раз обмусоленная тема.

Теперь захотелось ещё отслеживать исключения. Факт исключения отслеживатеся функцией
std::uncaught_exception(), это мне известно.

Но вот как получить доступ к объекту исключения? Хочется вызвать у этого объекта
метод what(), чтобы получить информацию об исключении.

Есть какие-то способы это сделать, пусть даже непортабельные? Хотя бы даже в gcc?
Re: Определить тип исключения в деструкторе
От: Sni4ok  
Дата: 18.05.09 07:34
Оценка: +1
Здравствуйте, Abulafia, Вы писали:

A>Теперь захотелось ещё отслеживать исключения. Факт исключения отслеживатеся функцией

A>std::uncaught_exception(), это мне известно.

A>Но вот как получить доступ к объекту исключения?



в деструкторе этого трейсера- никак, используете 2 макроса, 1й для начала блока, второй для конца блока- в котором делаете с исключением что душе угодно
Re: Определить тип исключения в деструкторе
От: ffk  
Дата: 18.05.09 08:18
Оценка:
Здравствуйте, Abulafia, Вы писали:

A>std::uncaught_exception(), это мне известно.


A>Есть какие-то способы это сделать, пусть даже непортабельные? Хотя бы даже в gcc?




Tracer::~Tracer 
{
    if (std::uncaught_exception())
    {
        try {
            throw;
        } catch (std::exception& ex) {
        {
            log(ex.what());
            throw;
        } catch (MyCoolException& ex)
        {
            log(ex.message());
            throw;
        } catch (...)
        {
            log("HBZ exception");
            throw;
        }
    }
}
Re[2]: Определить тип исключения в деструкторе
От: Abulafia  
Дата: 18.05.09 08:42
Оценка:
Здравствуйте, ffk, Вы писали:

ffk>Tracer::~Tracer 
ffk>{
ffk>    if (std::uncaught_exception())
ffk>    {
ffk>        try {
ffk>            throw;


Вот в этом месте выдает "terminate called without an active exception"
(если в gcc компилировать).
Re[3]: Определить тип исключения в деструкторе
От: Abulafia  
Дата: 18.05.09 08:44
Оценка:
Здравствуйте, Abulafia, Вы писали:

A>Вот в этом месте выдает "terminate called without an active exception"

A>(если в gcc компилировать).

И делает abort.
Re[3]: Определить тип исключения в деструкторе
От: ffk  
Дата: 18.05.09 09:00
Оценка:
Здравствуйте, Abulafia, Вы писали:

A>Здравствуйте, ffk, Вы писали:


A>
ffk>>Tracer::~Tracer 
ffk>>{
ffk>>    if (std::uncaught_exception())
ffk>>    {
ffk>>        try {
ffk>>            throw;
A>


A>Вот в этом месте выдает "terminate called without an active exception"

A>(если в gcc компилировать).

И в правду в диструкторе такой финт не проходит
Re: Определить тип исключения в деструкторе
От: Begemot_ Россия http://softvoile.com/
Дата: 22.05.09 16:21
Оценка:
Здравствуйте, Abulafia, Вы писали:

A>Пишу трассировщик для проги; перед компиляцией

A>в каждое тело функции простеньким скриптом
A>вставляется создание объекта Tracer:

А можно небольшой офтопик, хотелось бы про этот простенький скрипт подробнее узнать, тоже хочу такое!
Блог шароварщика
Микроблог про wxWidgets
--
Блог шароварщика ::Микроблог про wxWidgets
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.