2013-07-31 102 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

相關問題