Я хотел бы знать, есть ли исключительное решение для следующей проблемы:
Ниже у меня есть SomeClass, который имеет функцию-член, которая может выполнять несколько действий (команд).Отдельные действия выполняются другой функцией-членом, которая всегда оставляет объект в хорошем и предсказуемом состоянии.
Проблема заключается в том, как справиться с ситуацией, когда некоторые действия выполняются без ошибок, а затем одно действие вызывает исключение.Что нужно сделать сейчас.
Я вижу эти решения, но ни одно из них не кажется хорошим:
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 и заменит его оригиналом, если не произошло исключений.
Также команды могут зависеть от текущего состояния объекта.Как вы должны сначала добавить пару ключ / значение на карту, прежде чем вы сможете изменить значение.Это не означает, что «команда изменения» всегда должна сочетаться с «командой добавления», поскольку ключ также может уже присутствовать.