Перехват исключений, вызванных временными сетевыми ошибками - PullRequest
3 голосов
/ 24 февраля 2011

Мне нужно загрузить несколько URL-адресов, и может случиться так, что во время операций может произойти какое-то исключение, например java.net.NoRouteToHostException.Я считаю это временным исключением из-за ошибки, поскольку загрузка может завершиться успешно, если вы повторите попытку через некоторое время.
Итак, я хотел бы перехватить все эти исключения, связанные с временными ошибками, и я начал с них: java.net.NoRouteToHostException, java.net.SocketException
Можете ли вы перечислить другие исключения, подобные этим?

Ответы [ 4 ]

4 голосов
/ 24 февраля 2011

java.net.SocketException является родителем java.net.NoRouteToHostException, поэтому вы можете поймать только родителя.Остальные дети SocketException - BindException, ConnectException и PortUnreachableException.Может быть, нормально ловить только SocketException в вашем случае ...

2 голосов
/ 26 февраля 2011

Один шаблон, который иногда полезен для устранения временных ошибок при операциях с повторной попыткой, - это определение интерфейса обратного вызова с ошибками и некоторых классов, которые его реализуют; когда происходит ошибка, сообщите об этом объекту обратного вызова и решите, следует ли создать исключение или повторить действие. Поскольку существующие классы связи не следуют такому шаблону, может потребоваться перехватить их исключения и превратить их в обратные вызовы.

Обратите внимание, что этот подход позволяет намного чище обрабатывать многие сценарии обработки ошибок, чем обычная обработка исключений. Помимо прочего, он упрощает настройку политик для того, сколько попыток может быть предпринято, сколько времени они могут занять и т. Д., А также предоставляет возможность пропуска будущих попыток, если получено что-то вроде запроса «отмена».

0 голосов
/ 24 февраля 2011

HttpRetryException - другое.Может быть, все в java.net, которое не расширяет SocketException?

Один быстрый (и очень грязный) способ может быть

try {
....
} catch(Exception e) {
    if(e.getClass().getPackage().getName().equalsIgnoreCase("java.net")) {
        retry();
    }
}
0 голосов
/ 24 февраля 2011

Как @reef уже сказал, java.net.NoRouteToHostException расширяет java.net.SocketException, поэтому, если вы перехватываете java.net.SocketException, этого достаточно.Но java.net.SocketException расширяет IOException, и я думаю, что это то, что вы действительно должны поймать.Все проблемы ввода-вывода должны вызывать это исключение.

...