Łapanie wyjątków w pętli

Łapanie wyjątków w pętli
M3
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:104
0

Witam, napisałem kod który pobiera ze strony troche informacji. Jak wszystkie operacje I/O zwraca od czasu do czasu bledy (SocketReadTimeout itp.). Postanowiłem to rozwiązac w ten sposób:

Kopiuj
public class WebScraper extends Thread {

    public void run() {
        while (true) {
            try {
                 work();
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
        }
    }

    public void work() throws IOException {
        //pobiera informacje ze strony
    }
}

W przypadku wystapienia bledu w bloku try opuszcza on cala reszte w tym bloku i kontynuuje działanie od linijki po catch. Czyli tutaj, w przypadku wystapienia wyjatku powinien przejsc do kolejnej iteracji, czyli odpalic metode na nowo, i od nwoa sprobowac pobrac informacje.
Niestety, przy wystapieniu jakiegos wyjatku program zamyka się z błedem. Prosze o pomoc, co robie nie tak?

edytowany 1x, ostatnio: bogdans
Lena(R)
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:98
0

Ale z jakim błędem?

M3
Wejścia/Wyjscia. Zazwyczaj SocketReadTimeoutException ale wczoraj dostalem jakis inny (tez zwiazany z Socketem).
Lena(R)
Fajniej by było gdybyś wrzucił całego StackTrace'a, który jest rzucany do konsoli.
M3
Ok, wrzuciłem
M3
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:104
0

Wrzucam StackTrace:

Kopiuj
Exception in thread "Thread-0" java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
	at com.gargoylesoftware.htmlunit.WebClient.download(WebClient.java:2233)
	at com.gargoylesoftware.htmlunit.html.HtmlAnchor.doClickStateUpdate(HtmlAnchor.java:128)
	at com.gargoylesoftware.htmlunit.html.HtmlAnchor.doClickStateUpdate(HtmlAnchor.java:138)
	at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1251)
	at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1198)
	at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1158)
	at ws.WebScraper.work(WebScraper.java:165)
	at ws.WebScraper.run(WebScraper.java:26)
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
	at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
	at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
	at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
	at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
	at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:717)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:522)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
	at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:172)
	at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1486)
	at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1403)
	at com.gargoylesoftware.htmlunit.WebClient.download(WebClient.java:2226)
	... 7 more
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Nie znasz obsługi błędu SocketTimeoutEcxeption w pakiecie com.gargoylesoftware.... Być może wpierw wyświetlana jest informacja o błędzie, a potem wywoływane jest System.exit().


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Koziołek
takie rozwiązanie to było by zło w czystej postaci...
bogdans
zgadzam się, ale w dokumentacji http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/WebClient.html jest ostrzeżenie przy metodzie download (na czerwono): INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK. z ciekawości ściągnąłem pakiet, zdekompilowałem klasę WebClient - metody download nie ma

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.