2014-01-29 43 views
1

我在狀態機內調用了很多外部函數 - 或者明確地像sendMessage(...)或隱含地喜歡a!=b。到目前爲止,我一直試圖跟蹤可能拋出的東西,但隨着數量的增長,需要更好的方法。丟失一個異常並且允許它傳播到狀態機框架的代碼中顯然會造成很大的混亂。我應該如何處理狀態機中的異常?

我看到三個選項,但我希望有人能指出我一個更好的:

  1. 在每個onEntryonExitaction將一個try catch。由於它們有很多,而且它們很漂亮,所以這會使代碼長度增加一倍,並降低可讀性。

  2. 做了很多功能noexcept。如果函數在其他地方使用,或者它可以合法地拋出,並且例外是唯一的好解決方案,這似乎是不可能的。

  3. 修改我稱之爲使用alexandrescu的Expected<T>作爲返回類型的大部分函數。參見:http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C

哪個選項最好?有更好的策略嗎?

+0

異常處理程序應該如何處理捕獲到的異常?我想這隻會改變統計數據。 – smrt28

+0

將異常視爲您無法處理的異常。並且總是添加一個錯誤狀態,所以你不必扔。 –

回答

0

而是在try catch塊包裹每onEntry, onExitaction的,更好的辦法是實行onEntry,的OnExit和行動noexcept包裝版本,將只需調用onEntry, onExitaction try catch塊內處理引發的任何異常。

在代碼中,您只需簡單地調用wrappers而不是實際的函數,使用異常處理來獲得優勢,但避免重複try/catch邏輯。

void onExitWrapper(int arg1, int arg2) noexcept 
{ 
try 
{ 
onExit(arg1,arg2); 
} 
catch(/*whatever*/) 
{ 
//handle exception 
} 
} 

如果異常處理是不同的功能類似,你也可以創建一個接收函數指針/λ和輸入參數的特殊功能,並調用函數通過函數指針引用的輸入參數嘗試捕捉內部:

template <class Arg1,class Arg2,class Ret> Ret exceptionHandler(Ret (funcPtr *)(Arg1,Arg2),Arg1 arg1,Arg2 arg2) 
{ 
    Ret output; 
    try 
    { 
    output = funcPtr(arg1,arg2); 
    } 
    catch(/*whatever*/) 
    { 
    //handle exceptions 
    } 
    return output; 
} 
相關問題