2016-11-08 21 views
3

想,我有不同的功能,它可以拋出異常:如何使用try/catch塊封裝調用?

​​

我在代碼中不同的地方,可在下列方式使用這些功能:

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

其實,我使用的結果的功能立即在不同功能的許多地方。

什麼是最好的方式來包裝調用func_foo/func_bar_func_foobar函數與try/catch塊沒有全局重寫其他代碼段?

理想我想使用類似的東西(例如調用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

我必須承認,我覺得結合lambda表達式和宏很好玩。

#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