У меня следующая проблема.
У меня есть соединение с базой данных, которое перерабатывается (возвращается в пул).
Например:
{
session sql(conn_str); // take connection from pool
sql.exec("insert into ...")
} // at the end of the scope return connection to pool
Однако в некоторых случаях рециркуляция может быть ошибочной — например, отключение или какая-либо другая существенная ошибка.
Поэтому я хочу автоматически предотвратить повторное использование соединения. Я хочу реализовать следующую технику, используя std::uncaught_exception
, чтобы функция exec() обнаруживала исключения и предотвращала повторное использование:
session::exec(...)
{
guard g(this)
real_exec(...);
}
Где охранять:
class guard {
public:
guard(session *self) : self_(self) {}
~guard() {
if(std::uncaught_exception()) {
self->mark_as_connection_that_should_not_go_to_pool();
}
}
}
Теперь мне известно о http://www.gotw.ca/gotw/047.htm, который не рекомендует использовать std::uncaught_exception
в другом случае, я также не вижу ничего плохого в моем коде, приведенные примеры обсуждаются.
Возможны ли проблемы с этим кодом.
Примечание.
- Я хочу, чтобы это изменение было ненавязчивым, чтобы бэкенд SQL мог выбрасывать, а не проверять для каждого случая, критично оно или нет.
- Я не хочу, чтобы пользователь предпринимал какие-либо действия по этому поводу, чтобы для него это было прозрачно.