2011-08-29 120 views
0

我需要了解java異常處理的優先級。執行捕捉優先級

我有一個類控制器,有一個類NodeManager具有類NameManager。 NameManager有一個方法:

public LriNode getLriNode(...) throws HttpErrorException 
{ 
    if(condition) 
    throw new HttpErrorException (status); 
} 

類節點管理器使用中的前一個方法如下

public void nodeWriter(...) throws HttpErrorException 
{ 
      ... 
    try 
    { 
     //this can throw an HttpErrorExeption 
     lriNode = nameManager.getLriNode(resourceName); 
     ... 
    }  
    catch (HttpErrorException e) 
    { 
     if(e.getStatus().name().equals(HttpStatus.NOT_FOUND)) 
     { 
      //here can be thrown an HttpErrorExeption too 
      do work 
     } 
     else 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

終於類控制器使用下列

@RequestMapping(method=RequestMethod.PUT, value="document/{name}") 
public ModelAndView putDocument(@RequestBody String body, @PathVariable String name, HttpServletResponse response, HttpServletRequest request) 
{ 
    Source source = new StreamSource(new StringReader(body)); 

    try 
    { 

     NodeManager.nodeWriter(...); 
     return new ModelAndView(XML_VIEW_NAME, "document", document); 
    } 
    catch (HttpErrorException e) 
    { 
     response.setStatus(e.getStatus().value()); 
     e.printStackTrace(); 
    } 
    return null; 
} 

那麼前面的方法,那就是:當NameManager拋出一個HttpErrorException時,我期望NodeManger的內的try-catch塊方法將執行到例外。它發生的是該控件返回到Controller類,並且它的try-catch塊被執行。看起來nodeWriter()方法中的throws HttpErrorException語句在內部try-catch塊上具有優先級。

任何人都可以解釋我這樣的異常處理優先系統嗎?

+1

據我所知,目前還沒有這樣的異常處理優先系統。正如你指出的那樣,你可以在NodeWrite的catch語句中引發HttpErrorExeption。我認爲是這樣。 – darlinton

回答

1

Throwable不會傳播處理該類型Throwable的try/catch塊。檢查堆棧跟蹤中的行號,這將確切地告訴你異常來自何處。 (順便說一下一些java IDE有一個「分析堆棧跟蹤」功能,允許你直接點擊相關的類和行號。我從來沒有發現太多用處,但是這個功能是存在的,所以有人一定會覺得它有用。 )

+0

這是事實:HttpErrorException是我定義的用於處理Http通信閒置的自定義異常。 – MaVVamaldo

+0

繼續從以前的評論(5分鐘評論編輯問題)。 這是事實:HttpErrorException是我定義的用於處理Http通信問題的自定義異常。我正在使用Spring和它自己的RestTemplate,並且用於聯繫網絡實體的方法屬於這樣的類。不幸的是,這些方法可能會拋出一個名爲Http ** Client **的Spring框架異常,我誤以爲是我定義的異常。最後,所有問題都是關於我的分心。 我感謝你們所有的時間。 – MaVVamaldo

1

在你的代碼中,你提到你的Controller正在處理異常。那麼,在nodeWriter()方法調用中,您的捕獲暗示可以重新拋出HttpErrorException

public void nodeWriter(...) throws HttpErrorException 
{ 
      ... 
    try 
    { 
     //this can throw an HttpErrorExeption 
     lriNode = nameManager.getLriNode(resourceName); 
     ... 
    }  
    catch (HttpErrorException e) 
    { 
     if(e.getStatus().name().equals(HttpStatus.NOT_FOUND)) 
     { 
      //LOOK HERE!!! --> here can be thrown an HttpErrorExeption too 
     } 
     else 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

如果可以重新拋出HttpErrorException,那麼Controller調用然後nodeWriter()將處理該異常。