09.11.2012 16:49
0 18 0
Поправка на качество соединения.
Обратим внимание на то, что связь - дело не надёжное. Особенно через интернет. И сервер ГВД не всегда может ответить. И если сервер не отвечает - хорошо бы попытку повторить.
Сделаем для этого некоторые изменения. Убираем из метода GetPage
блок try-catch. Добавляев в его описание выброс исключений:
private void GetPage(String Address) throws MalformedURLException, URISyntaxException, IOException
В методе ScanDiapason добавим обработку исключений. Теперь он будет выглядеть так:
private void ScanDiapason(int start_value, int stop_value) {
for (int i = start_value; i <= stop_value; i++) {
try {
GetPage("http://www.heroeswm.ru/pl_info.php?id=" + i, i);
} catch (Exception ex) {
i--;
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException ex1) {
System.out.println(ex1.getMessage());
}
}
}
}
Что тут происходит. Если метод GetPage бросает исключение, то мы уменьшаем счётчик i, чтобы при следующей итерации снова пробовать обрабатывать того-же персонажа, и ждём 500 миллисикунд перед следующей попыткой. Thread.currentThread().sleep(500) - это команда ожидать текущему потоку. Этод метод сам может бросить исключение - InterruptedException. Это прерывание ожидания, вызванное внешним прерыванием. Не будем углубляться в эту тему.
Теперь, если сервер по каким-либо причинам недоступен, бот раз в полсекунды будет повторять попытку, а не пойдёт перебирать персонажей дальше.
Сразу отметим, что MalformedURLException, URISyntaxException - это исключения формата адреса. Обрабатывая их таким-же образом, как и IOException, мы берём на себя ответственность за то, что адрес всегда будет верный. Если в адресе всё-таки появится ошибка, поток, в котором это произойдёт, зациклится на нём.
Сделаем для этого некоторые изменения. Убираем из метода GetPage
блок try-catch. Добавляев в его описание выброс исключений:
private void GetPage(String Address) throws MalformedURLException, URISyntaxException, IOException
В методе ScanDiapason добавим обработку исключений. Теперь он будет выглядеть так:
private void ScanDiapason(int start_value, int stop_value) {
for (int i = start_value; i <= stop_value; i++) {
try {
GetPage("http://www.heroeswm.ru/pl_info.php?id=" + i, i);
} catch (Exception ex) {
i--;
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException ex1) {
System.out.println(ex1.getMessage());
}
}
}
}
Что тут происходит. Если метод GetPage бросает исключение, то мы уменьшаем счётчик i, чтобы при следующей итерации снова пробовать обрабатывать того-же персонажа, и ждём 500 миллисикунд перед следующей попыткой. Thread.currentThread().sleep(500) - это команда ожидать текущему потоку. Этод метод сам может бросить исключение - InterruptedException. Это прерывание ожидания, вызванное внешним прерыванием. Не будем углубляться в эту тему.
Теперь, если сервер по каким-либо причинам недоступен, бот раз в полсекунды будет повторять попытку, а не пойдёт перебирать персонажей дальше.
Сразу отметим, что MalformedURLException, URISyntaxException - это исключения формата адреса. Обрабатывая их таким-же образом, как и IOException, мы берём на себя ответственность за то, что адрес всегда будет верный. Если в адресе всё-таки появится ошибка, поток, в котором это произойдёт, зациклится на нём.