2010-07-12 114 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」。

編譯器警告你這個問題,因爲如果沒有的話,它會導致不準確的錯誤處理。