наверняка многие сталкивались с подобным сценарием когда думаешь искусственный
цикл или goto...
попробую объяснить на примере скачивания файла из сети
есть некая функция которая скачивает из интернета файл
иногда сервер закрывает соединение не отдав весь файл
я делаю новый запрос с полем Range: дабы докачать "хвост"
и иногда сервер отвечает кодом 404 Not Found у меня вылетает исключение
которое надо перехватить на месте получить новую ссылку на этот же файл
и докачать файл
вопрос в том как организовать тело функции самое очевидное это
void f()
{
// declare collect & progress var's
repeat:
generate_link()
try
{
read_internet_file(link)
}
catch (web_exception& e)
{
if (e.code == http_code::not_found)
{
goto repeat;
}
throw;
}
}
есть менее очевидный вариант но зато без goto
void f()
{
// declare collect & progress var's
for (;;)
{
generate_link()
try
{
read_internet_file(link)
break
}
catch (web_exception& e)
{
if (e.code == http_code::not_found)
{
continue;
}
throw;
}
}
}
как лучше организовать тело функции ?
спасибо