2011-12-07 9 views
1

次の問題があります。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を使用することをお勧めしません。私のコードにも間違いはありません。 提供されている例が説明されています。

このコードに問題がありますか?

注:

  1. 私は、SQLバックエンドはそれが重要であるかどうかをすべてのケースをチェック投げないことができるであろうように、この変化は非侵入になりたいです。
  2. 私は、ユーザーがそれについて何か行動を起こさせないように、彼は彼にとって透明であると思っています。

答えて

2

私はより簡単なものの上にメソッドに任意の利点が表示されない。このソリューションのverbosenessがあなたを気にした場合

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 
} 

もう1つの可能性は、成功が達成されるまで失敗すると想定することです。最後に

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が返されます、特に

例外の巻き戻し中に呼び出されているデストラクタから呼び出されたとき。

これはまさにあなたが期待しているように見えます。

+0

私はこの方法を使用しない理由は、はるかに冗長であるためです。だから同じことをする二十ダースの機能を持っているならば、 "ガード"はそのような問題を解決するための簡単でクリアな方法です。 – Artyom

+0

また、 'std :: uncaught_exception()'は標準的な関数であり、try/catchとしてあまり使われないかもしれません。 – Artyom

+0

'std :: uncaught_exception()'を使用する特定のシナリオがありますか? – Artyom

関連する問題