Как я могу поймать исключение в расширенном цикле for и перезапустить процесс для этого цикла? - PullRequest
1 голос
/ 21 марта 2012

Я начал работать с улучшенными циклами for из-за его лучших практик и умений работать с ArrayLists.

Мой код в основном получает ArrayList, который содержит ссылки на песни и анализирует этот список, загружая песни.Одним из исключений является TimeoutException, которое обычно происходит, когда сервер перегружен или существует нестабильность при подключении к Интернету.

Чтобы уточнить:

try
{
    for(Track track : album.getTracks())
    {
        songdown.downloadTrack(track, directorio, formataudio);
    }
}
catch (TimeoutException te)
{ 
    System.out.println("Timeout!");
}

дорожка является ArrayList, что являетсяанализируется один за другим функцией songdown.downloadTrack.В случае сбоя загрузки возникает TimeoutException, но я не знаю, как обработать это исключение, чтобы удалить сгенерированный мной файл и перезапустить оператор for с той же дорожки, чтобы загрузка могла повториться.

Ответы [ 4 ]

6 голосов
/ 21 марта 2012

Хотя остается открытым вопрос, насколько это целесообразно, вам лучше использовать внутренний цикл, который повторяется до тех пор, пока не будет успешным. Примерно так:

for (Track track : album.getTracks()) {
    boolean downloaded = false;
    while (!downloaded) {
        try {
            songdown.downloadTrack(track, directorio, formataudio);
            downloaded = true;
        } catch (TimeoutException te) { /* delete partially downloaded song etc */ }
    }
}

Скорее всего, вам потребуется максимальное количество повторов в каждой итерации цикла for или некоторые другие дополнительные проверки, чтобы избежать бесконечного цикла.

0 голосов
/ 21 марта 2012

Вот пример фрагмента, я думаю, что вы можете решить свою проблему, следуя этому пути

ArrayList<String> a = new ArrayList<String>();
    a.add("a");
    a.add("w");
    a.add("d");
    //Iterator<String> i = a.iterator();
    for(String s:a){
        try{
            if(s.equals("w")){
                throw new Exception("Hello");
            }else{
                System.out.println(s);
            }
        }catch (Exception e) {
            continue;

        }
    }

В этом фрагменте я явно выбрасываю исключение, когда он генерируется, блок catch будет выполняться, там я использовал ключевое слово continue . Это ключевое слово предназначено для решения подобных ситуаций.

0 голосов
/ 21 марта 2012

Конечно, есть много подходящих подходов.

Вот одна из возможностей:

int failureCount = 0;

while (failureCount < maxFailures) {
    try {
        parseAndDownload(someList);    
        break;
    }
    catch (Exception ex) {
        failureCount ++;
    }
}
0 голосов
/ 21 марта 2012

Сначала пройдите , это . Прежде всего, блок catch должен запускаться после завершения блока try.

Вы можете перехватить исключение в блоке catch и написать код, который вы хотите выполнить, когда возникнет исключение, которое в вашем случае начинается снова и удаляет половину загруженных песен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...