2011-08-29 92 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()将处理该异常。