В фортране я использую goto для отката, и я обычно начинаю с 999 назад (в фортране, метки goto только числовые)
call foo(err)
if (err /= 0) goto 999
call bar(err)
if (err /= 0) goto 998
call baz(err)
if (err /= 0) goto 997
! everything fine
error = 0
return
997 call undo_bar()
998 call undo_foo()
999 error = 1
return
Я также использую метки больше 1000, если по какой-то причине я хочу пропустить часть отката.
В C и других языках я бы использовал номер отката (например, rollback1, rollback2), поэтому по метке ясно, что вы собираетесь выполнить откат. Это в основном единственная веская причина для использования goto.