1

我从我的状态机中调用了很多外部函数——显式喜欢sendMessage(...)或隐式喜欢a!=b。到目前为止,我一直试图跟踪可以抛出的东西,但随着数量的增长,对更好方法的需求也在增加。错过一个异常并让它传播到状态机框架的代码中显然会造成很多混乱。

我看到了三个选项,但我希望有人能指出一个更好的选项:

  1. try catch在每个onEntryonExit处放置一个action。由于它们有很多而且它们很漂亮,这几乎会使代码长度增加一倍并降低可读性。

  2. 做一大堆功能noexcept。如果函数在其他地方使用,或者它可以合法地抛出并且异常是唯一好的解决方案,这似乎是不可能的。

  3. 修改我调用的大多数函数以使用 alexandrescuExpected<T>作为返回类型。请参阅:http ://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C

哪个选项最好?有没有更好的策略?

4

1 回答 1

0

与其包装每一个onEntry, onExitaction在 try catch 块中,更好的方法是实现 onEntry、onExit 和 action 的 noexcept 包装器版本,它们将简单地在 try catch 块中调用onEntry, onExitaction处理任何抛出的异常。

在代码中,您只需调用包装器而不是实际函数,使用异常处理对您有利,但避免重复 try/catch 逻辑。

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

如果不同函数的异常处理类似,您还可以创建特殊函数,接收函数指针/lambda 和输入参数,并在 try catch 中使用输入参数调用函数指针引用的函数:

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;
}
于 2014-01-29T19:57:33.117 回答