Вы пытаетесь начать религиозную войну?
Серьезно, иногда есть места, где goto - лучший выбор. За двадцать лет я видел около 3 или 4. Многократные возвраты не обязательно являются злом, но если вам придется повторять много кода очистки, они становятся довольно грязными.
Очень часто вы можете изменить код, чтобы сделать такой выбор ненужным. Трудно сделать конкретные предложения, не видя ваш код, но может быть что-то вроде этого:
void f()
{
bool bDone=false;
while (!bDone && get_input())
{
if (input == "cool")
{
process_cool();
bDone = true;
}
else if (input == "unfinished")
{
process_something();
}
else
{
// error
bDone = true;
}
}
}
Большая помощь в рефакторинге - убедиться, что в цикле нет десятков строк. Если у вас есть куча работы, разбейте ее на функции и вызовите небольшое количество функций из цикла while.
Помните, что одна функция должна делать только одно.
Другим подходом, который настоятельно рекомендуется, является использование исключений для обработки условий ошибки, но использование исключения, если вы только что закончили обработку, является плохим стилем, так что это может не полностью решить вашу проблему.
Если вы все еще в замешательстве, рассмотрите возможность размещения более реалистичного фрагмента кода, и мы сможем подсказать, как лучше всего справляться.
Удачи!