gpt4 book ai didi

c++ - 如何处理多个 Action 和异常

转载 作者:行者123 更新时间:2023-11-28 08:22:16 25 4
gpt4 key购买 nike

我想知道是否有以下问题的异常(exception)解决方案:

下面我有一个 SomeClass,它有一个可以执行多个操作(命令)的成员函数。各个 Action 由另一个成员函数执行,该函数始终使对象处于良好且可预测的状态。

问题是如何处理一些 Action 没有错误执行然后一个 Action 导致异常的情况。现在应该做什么。

我看到了这些解决方案,但感觉都不好:

a) 将异常传递给“ExecuteMultipleCommands”的调用者。这使对象处于良好但不可预测的状态(不知道执行了哪些操作)。

b) 在命令失败后继续执行命令。如果命令不是独立的,这是一个问题,也很难知道返回给调用者什么。

c) 在第一个异常中尝试恢复已经完成的操作,以便对象返回到调用“ExecuteMultipleCommands”之前的状态。现在在“回滚”期间可能会发生另一个异常。

下面的代码不是真正的代码,但应该能说明我的问题:

class SomeClass
{
public:
struct Command
{
/*...*/
};

void ExecuteOneCommand( const Command &oneCommand )
{
/* either completely executes a command or throws exception and leave object in unchanged state */
}

void ExecuteMultipleCommands( const vector< Command > &commands )
{
vector< Command >::const_iterator it = commands.begin();
for ( ; it != commands.end(); ++it )
{
try
{
ExecuteOneCommand( *it );
}
catch( /* some exception type */ )
{
/* what to do ? */
}
}
}
};

是否有关于此问题或其他出版物的设计模式?我已经搜索过,但几乎是空的。

注意:代码是真实问题的简化版。在实际代码中, SomeClass 实例持有的多个对象将在命令期间发生变化。如果没有发生异常,这将使使用 SomeClass 实例的拷贝并用原始实例替换它变得更加困难。

还可以根据对象的当前状态来依赖命令。就像您必须先将键/值对添加到 map 才能更改值。这并不意味着“更改命令”必须始终与“添加命令”结合使用,因为 key 也可能已经存在。

最佳答案

我会尝试一个答案,但我发现这个问题有点难以理解。

我会使用您的对象的拷贝。

而不是直接在你的对象上执行:- 复制- 对该对象执行命令如果没有触发异常- 退回拷贝/以拷贝替换原件别的- 保持原来的(在你的情况下,在 catch 中保留原件)

我也承认封装你的命令:我的意思是有一个必须一起执行的命令列表。

这样你就可以将你的代码转换成类似的东西

  class SomeClass
{
public:
struct Command
{
/*...*/
};

void ExecuteOneCommand( const Command &oneCommand )
{
/* either completely executes a command or throws exception and leave object in unchanged state */
}

SomeClass ExecuteCommands( const vector< Command > &commands )
{
SomeObject save = getCopy();
try
{

ExecuteMultipleCommands(commands);
}catch( /* some exception type */ )
{
return save
}
return this;
}

void ExecuteMultipleCommands( const vector< Command > &commands )
{

vector< Command >::const_iterator it = commands.begin();
for ( ; it != commands.end(); ++it )
{
ExecuteOneCommand( *it );
}
}
};

编辑我刚刚意识到,如果您从类中提取保存部分,效果会更好:

SomeObject save = someObjectInstance.copy();
if(!someObjectInstance.executeCommands){
//free someObjectInstance
someObjectInstance = save;
}

关于c++ - 如何处理多个 Action 和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com