次の問題があります。uncaught_exceptionを使用してエラー状態を処理する
データベース接続がリサイクルされています(プールに戻す)。例えば
:
{
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バックエンドはそれが重要であるかどうかをすべてのケースをチェック投げないことができるであろうように、この変化は非侵入になりたいです。
- 私は、ユーザーがそれについて何か行動を起こさせないように、彼は彼にとって透明であると思っています。
私はこの方法を使用しない理由は、はるかに冗長であるためです。だから同じことをする二十ダースの機能を持っているならば、 "ガード"はそのような問題を解決するための簡単でクリアな方法です。 – Artyom
また、 'std :: uncaught_exception()'は標準的な関数であり、try/catchとしてあまり使われないかもしれません。 – Artyom
'std :: uncaught_exception()'を使用する特定のシナリオがありますか? – Artyom