Пишу трассировщик для проги; перед компиляцией
в каждое тело функции простеньким скриптом
вставляется создание объекта Tracer:
Было:
void someFunc()
{
doSomethingElse();
}
Стало:
void someFunc()
{
Tracer _tracer("someFunc()");
doSomethingElse();
}
В конструкторе -- вывод ">> someFunc()" в лог, в деструкторе -- вывод "<< someFunc()".
Ну, вы знаете. Очевидная и уже тыщщу раз обмусоленная тема.
Теперь захотелось ещё отслеживать исключения. Факт исключения отслеживатеся функцией
std::uncaught_exception(), это мне известно.
Но вот как получить доступ к объекту исключения? Хочется вызвать у этого объекта
метод what(), чтобы получить информацию об исключении.
Есть какие-то способы это сделать, пусть даже непортабельные? Хотя бы даже в gcc?
Здравствуйте, 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;
}
}
}
Здравствуйте, ffk, Вы писали:
ffk>Tracer::~Tracer
ffk>{
ffk> if (std::uncaught_exception())
ffk> {
ffk> try {
ffk> throw;
Вот в этом месте выдает "terminate called without an active exception"
(если в gcc компилировать).
Здравствуйте, 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 компилировать).
И в правду в диструкторе такой финт не проходит
Здравствуйте, Abulafia, Вы писали:
A>Пишу трассировщик для проги; перед компиляцией
A>в каждое тело функции простеньким скриптом
A>вставляется создание объекта Tracer:
А можно небольшой офтопик, хотелось бы про этот простенький скрипт подробнее узнать, тоже хочу такое!