Я видел использование GOTO в Си для этой цели.
Поскольку в C нет конструкции finally, был необходим метод для освобождения всей вашей памяти, даже если вы выходили из функции раньше.
Так что по сути это так
(может кто-то исправить мой синтаксис C, если я ошибаюсь, я немного заржавел)
int foo()
{
/* Do Stuff */
if(!DoSomething())
GOTO Failure;
if(!DoSomething2())
GOTO Failure;
if(!DoSomething3())
GOTO Failure;
/* return success */
return true;
Failure:
/* release allocated resources */
/* print to log if necessary */
return false;
}
Важное примечание
Не используйте GOTO для выполнения потока. Они должны использоваться только при ошибке и только для перехода к концу текущей функции. Если вы используете их для чего-то еще, вы создаете код спагетти, который может разрушить ткань реальности. Только не делай этого.
EDIT
Как отметил один из авторов, использование Exit (x) убьет всю вашу программу, что оставляет это решение зарезервированным для фатальных ошибок. Однако ваше оригинальное предлагаемое решение (DS () && DS2 () && DS3 ()) в одной строке создает проблему для обработки ошибок.
Если вы хотите обернуть функции в какую-то функцию обработки ошибок, специфичную для функции, нет способа сделать это, когда вы оборачиваете вызовы всех функций в одну строку. Итак, по крайней мере, вы могли бы сделать что-то вроде
int result1 = 0;
int result2 = 0;
int result3 = 0;
result1 = DoSomething();
if(result1)
result2 = DoSomething2();
if(result2)
result3 = DoSomething3();
return result1 && result2 && result3;
Поскольку этот метод не исключает обработку ошибок.