Я не вижу преимущества вашего метода перед чем-то более простым:
session::exec()
{
try
{
real_exec();
}
catch(...)
{
mark_as_connection_that_should_not_go_to_pool();
throw;
}
}
Если многословность этого решения вас беспокоит, отмечу, что они еще не вырвали макросы из C ++. Я бы не предпочел эту версию, так как она маскирует базовый код и выглядит некрасиво.
#define GUARD try {
#define ENDGUARD } catch(...) { mark_as_connection_that_should_not_go_to_pool(); throw; }
session::exec()
{
GUARD
real_exec();
ENDGUARD
}
Другая возможность - предполагать неудачу, пока не будет достигнут успех.
session::exec()
{
mark_as_connection_that_should_not_go_to_pool();
real_exec();
mark_as_connection_that_may_go_to_pool();
}
Наконец, чтобы ответить на вопрос о том, будет ли uncaught_exception
работать так, как вы обрисовали, я процитирую документацию Microsoft по этой функции:
В частности, uncaught_exception вернет true при вызове из деструктора, который вызывается при отмене исключения.
Кажется, он делает именно то, что ожидал.