2014-01-29 103 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; 
} 
相关问题