for vs goto vs ... (не холивар)
От: jyuyjiyuijyu  
Дата: 21.01.14 17:25
Оценка:
наверняка многие сталкивались с подобным сценарием когда думаешь искусственный
цикл или 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;
        }
    }
}


как лучше организовать тело функции ?

спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.