2016-11-08 3 views
3

と仮定、私は例外を投げることができ、異なる機能を持っています、私は結果を使用しています実際にtry/catchブロックでコールを折り返す方法は?

some_func(/*applying of func_foo or func_bar or func_foobar*/(...)) 

​​

私は次のようにこのような機能を使うことができ、コード内のさまざまな場所を持っています異なる機能内の多くの場所ですぐに使用できます。

他のコードをグローバルに書き直すことなくtry/catchブロックでfunc_foo/func_bar_func_foobar関数の呼び出しをラップする最良の方法はありますか?

理想的には、私はそのような何かを使用したい(例えばfunc_fooを呼び出すために)

some_func(TRY_CATCH_BLOCK(func_foo(...))); 

catchハンドラは、異なるタイプ

catch (const ExceptionFoo& e) 
{ 
    throw SomeException1("Some message from e"); 
} 
catch (const ExceptionBar& e) 
{ 
    throw SomeException2("Some message from e"); 
} 
+1

?着呼者か発呼者か? – NathanOliver

+1

'catch'では何をすべきですか?伐採や再訓練に似た何か? – Quentin

答えて

6

で例外を伝播します私は組み合わせラムダを見つけることを認めなければならないとマクロはかなり楽しい。

#define TRY_CATCH_BLOCK(...)   \ 
    [&]() -> decltype(auto) {  \ 
     try {      \ 
      return __VA_ARGS__;  \ 
     } catch(/* ... */) {   \ 
      /* Handle and rethrow */ \ 
     }       \ 
    }() 

これは、別の関数呼び出しでインターリーブされたものを含め、指定したとおりに呼び出すことができます。キャッチを処理しなければならない

some_func(TRY_CATCH_BLOCK(func_foo(...))); 

See it live on Coliru

関連する問題