2008年11月27日木曜日

nested_exception の例

 nested_exception の良い例を作成せよと、指令が出ていたけど、漫然と思い当たるところを書き散らしてみる。ちなみに、良い例なんて思いつきません(爆)。

 外部から安全にスレッドを中断させる方法が無い Windows では、boost::thread のinterruption において、例外を流用するというトリッキーで賢い方法を採用しています。

class BOOST_THREAD_DECL thread_interrupted
{};

std::exception から派生すると、途中で例外をキャッチした後に、thread_interrupted かどうかを調べて、例外の再送をしないといけないので面倒です。MIXIN 用との事だけど、このように例外もグループ化できれば、さぞかし便利な場面があるのかもしれない・・・という感覚だけは残ります。

 で、更に進めて、階層化できた方が面白いんじゃなかろうか?って感じて、考えたのが下。

template<int LEVEL>
class level_exception : public std::nested_exception {
public:
int level() const { return LEVEL; }
bool deeper( int level ) const { return level >= LEVEL; }
};

階層で捕まえたければ

} catch( level_exception<3>& le ) {
...
}

ネストで捕まえたければ

} catch( nested_exception& ne ) {
if( ne.deeper( 3 ) ) {
...
} else {
throw;
}
}

と、こんな感じ。あんまり面白くないか…。

0 件のコメント: