2013-07-31 67 views
0

第一次尝试使用Java,请友好。我在Web Controller中有以下代码,其中基于封闭的Switch-Case语句调用服务。
我面临的问题是,如果服务调用引发异常,则此异常将显示在JSP页面上。基本上,代码永远不会到达线路:
在这种情况下的异常处理

if(!statusFlag) 
{ 
     model.addAttribute("statusFlag", statusFlag); 
     return "myJspPage" 
} 

我如何确保执行去上面的纹路,即使一个异常在Web服务调用抛出:

statusFlag = myWebService.getMeStatus(); 

我应该在try-catch块中包含整个Switch语句?

段:

@Controller 
public String mySpringController() throws Exception 
{ 
    //rest of the controller code 
     switch (condition) 
     { 
     case MAY : 
        statusFlag = myWebService.getMeStatus(); 

        if(!statusFlag) 
        { 
         model.addAttribute("statusFlag", statusFlag); 

         return "myJspPage" 
        } 
        break; 

     case JUNE : 
        statusFlag = myWebService.getMeStatus(); 

        if(!statusFlag) 
        { 
         model.addAttribute("statusFlag", statusFlag); 

         return "myJspPage" 
        } 
        break; 

     case JULY : 
        statusFlag = myWebService.getMeStatus(); 

        if(!statusFlag) 
        { 
         model.addAttribute("statusFlag", statusFlag); 

         return "myJspPage" 
        } 
        break; 
     default: 

        //Do something by default. 

     } 

return "myJspPage"; 

} 

回答

1

如果该行抛出一个异常,则意味着它永远不会返回,因此statusFlag仍然具有其原始值,并且该方法的执行已停止。如果你想抓住异常并做一些事情,你需要将它包围在try - catch中。

我看你使用的是Spring。在Spring控制器中,你也可以拥有你自己的特殊方法,当异常发生时被调用。使用@ExceptionHandler注释。

+0

嗨jbx,@ExceptionHandler听起来不错。那么只需在控制器中用这个注释声明一个常用的方法,并且在抛出异常的时候就会调用它? – breakingBad

+0

是的,如果您需要不同的行为,您甚至可以拥有多个行为,具体取决于抛出哪个异常。不过,这是Spring特有的。如果你在Java中生锈,你需要更多地了解错误处理的工作原理。在Java中,通过检查错误代码(如旧的C风格的代码),不鼓励错误检测,因为它具有各种缺点(错误处理变成可选的,错误处理与普通'积极'代码混合,你必须深入挖掘进一步的信息,而异常携带所有的信息,它可以为每个错误不同,等等。) – jbx

+0

感谢您的回应。你们现在肯定已经知道我是来自C背景的人。 – breakingBad

0

我没有看到你的switch语句的目的,因为每一种情况下做同样的事情。

但基本上你可以把你的Web服务调用在try-catch块

try{ 
    webservice.call(); 
} 
catch (Exception e){ 
    // handle the exception 
} 
finally{ 
    //anything in here will be executed regardless if an exception is caught or not 
} 
+0

谢谢。它只是一个骨架代码。 – breakingBad

0

你在C++中,在那里你会返回错误代码的风格编写Java,然后检查他们是否确定什么都出错了。这段代码有很多问题,但是显示异常的原因是您从不会抛出异常。你应该把你的try-catch块的位置取决于例外的含义;如果它不是特定于某个月的东西,那么是的,请附上整个switch声明以分享错误处理。

另一方面,您是否复制并粘贴了您的实际代码,或者您是否尝试重新键入示例?那些case块看起来完全相同。

+0

Hello Chrylis,谢谢你的帮助。我只是输入了一些骨架代码。 – breakingBad

相关问题