A goto
можно всегда избегать, давая код уборщика.
Кстати, то же самое относится и к break
s вне switch
. Ключевое слово continue
немного менее осуждаемо, потому что, по крайней мере, оно выполняет условие замкнутого цикла.
Важно ловить исключения в нужном месте, где вы можете наиболее эффективно справиться с этим условием.
И если условие оказывается неудобным (например, «повторить попытку?» В моем случае), рассмотрите возможность его отмены («провал?») Для более чистой структуры.
// Tries until successful, or user interaction demands failure.
bool initialize() {
for ( ;; ) {
try {
// init code
return true;
}
catch ( ... ) {
cout << "Init Failed. Fail Program?" << endl;
if ( yes ) {
return false;
}
}
}
}
int main() {
if ( ! initialize() ) {
return EXIT_FAILURE;
}
// rest of program
return EXIT_SUCCESS;
}
Примечания: Это не использует goto
или break
и не повторяется ( особенно не из блока catch
).