Невозможно поймать IOException - PullRequest
1 голос
/ 12 июля 2010

Выдается IOException, и по какой-то причине его невозможно поймать. Посмотрите на код ниже. Трассировка стека говорит, что IOException генерируется при вызове метода apply. Однако исключение не попадает в условие catch. Когда я пытаюсь перехватить IOException, Eclipse жалуется, говоря: «Недоступный блок catch для IOException. Это исключение никогда не выдается из тела оператора try»

Почему это происходит?

Код:

try {
    action.apply();
}
catch (Exception e) {
    System.out.println("Fail");
}

Вот трассировка стека:

java.io.IOException: Unable to download JavaScript from 'somesite' (status 404).
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadJavaScriptFromUrl(HtmlPage.java:1023)
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:967)
at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:353)
at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:225)
at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:235)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:718)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:676)
at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1136)
at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1038)
at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206)
at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329)
at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:2999)
at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:1991)
at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:895)
at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)
at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:896)
at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:350)
at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:304)
at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:134)
at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:101)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:420)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:303)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:360)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:228)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:216)
at org.openqa.selenium.internal.seleniumemulation.Open.handleSeleneseCommand(Open.java:36)
at org.openqa.selenium.internal.seleniumemulation.Open.handleSeleneseCommand(Open.java:22)
at org.openqa.selenium.internal.seleniumemulation.SeleneseCommand.apply(SeleneseCommand.java:33)
at Action.runSeleniumAction(Action.java:235)
at SessionDriver.runSession(SessionDriver.java:192)
at SessionDriver.run(SessionDriver.java:123)

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

метод apply () полностью обрабатывает исключение и не перебрасывает его. Если это так, то оно будет помечено как «public void apply () throws IOException».

Компилятор предупреждает вас об этом, поскольку в противном случае это приведет к неточной обработке ошибок.

1 голос
/ 12 июля 2010

Правильно, сам метод apply () не выбрасывает это исключение. Что-то еще внутри этого метода apply () есть, и это что-то печатает полную трассировку стека вместо сообщения «сбой», которое вы решили как-то лучше.

0 голосов
/ 12 июля 2010

Вы используете eclipse - поэтому самый простой способ добраться до источника исключения - запустить приложение в режиме отладки и установить точку останова на java.io.IOException. Поэтому всякий раз, когда это исключение выдается где-то на работающей виртуальной машине, eclipse останавливает приложение и показывает вам поток, класс и строку кода (если доступно).

0 голосов
/ 12 июля 2010

Как вы видите на трассировке стека, ваш код отсутствует, поэтому вы не можете поймать исключение. Я предполагаю, что SessionDriver.run() вызывается из другого потока.

Вы пробовали Selenium-RC ? Он должен быть в состоянии отловить эти ошибки и передать их в контрольный пример.

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