2010-07-12 97 views
1

抛出IOException并且出于某种原因无法捕获。看看下面的代码。堆栈跟踪说调用“apply”方法时抛出IOException。然而,这个例外并没有被catch子句捕捉到。当我尝试去捕捉IOException时,Eclipse会抱怨说:“IOException的无法到达catch块,这个异常永远不会从try语句体中抛出”无法捕捉到IOException

为什么会发生这种情况?

代码:

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) 

回答

1

对,apply()方法本身并不抛出该异常。应用方法()中的其他内容是,并且打印完整的堆栈跟踪,而不是您已经决定好的“失败”消息。

0

正如您在堆栈跟踪中看到的那样,您的代码缺失,因此您无法捕获异常。我的猜测是SessionDriver.run()是从另一个线程调用的。

你试过Selenium-RC?它应该能够捕获这些错误并将它们传递给测试用例。

0

您正在使用eclipse - 所以找到异常源的最简单方法是在调试模式下运行应用程序并在java.io.IOException上设置断点。因此,无论何时在正在运行的VM中的某处引发此异常,eclipse都会停止应用程序,并向您显示线程,类和代码行(如果可用)。

3

apply()方法完全处理异常并且不重新抛出它。如果它确实会被标记为“public void apply()throws IOException”。

编译器警告你这个问题,因为如果没有的话,它会导致不准确的错误处理。