2010-07-12 5 views
1

Une exception d'E/S est lancée et, pour une raison quelconque, impossible à capturer. Jetez un oeil sur le code ci-dessous. La trace de la pile indique qu'une exception d'E/S est levée lors de l'appel de la méthode "apply". L'exception n'est cependant pas interceptée par la clause catch. Lorsque j'essaie d'attraper une exception IOException à la place, Eclipse se plaint disant: "Bloc catch inaccessible pour IOException Cette exception n'est jamais levée du corps de l'instruction try"Impossible d'intercepter IOException

Pourquoi cela se produit-il?

code:

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

Voici le stacktrace:

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) 

Répondre

1

droit, la méthode elle-même ne pas jeter cette exception apply(). Quelque chose d'autre à l'intérieur de cette méthode apply() est, et que quelque chose imprime la trace de la pile complète au lieu du message "fail" que vous avez décidé d'améliorer.

0

Comme vous pouvez le voir dans la pile, votre code est manquant, donc vous ne pouvez pas attraper l'exception. Ma conjecture est que SessionDriver.run() est appelée à partir d'un thread différent. Avez-vous essayé Selenium-RC? Il devrait être capable d'attraper ces erreurs et de les transmettre au cas de test.

0

Vous utilisez eclipse - la manière la plus simple d'accéder à la source de l'exception est d'exécuter votre application en mode débogage et de définir un point d'arrêt sur java.io.IOException. Donc, chaque fois que cette exception est lancée quelque part dans la VM en cours d'exécution, eclipse arrêtera l'application et vous montrera le fil, la classe et la ligne de code (si disponible).

3

La méthode apply() gère intégralement l'exception et ne la réimprime pas. Si c'était le cas, il serait marqué comme "public void apply() throws IOException".

Le compilateur vous en avertit à ce sujet, car il en résulterait une gestion incorrecte des erreurs si ce n'était pas le cas.

Questions connexes