执行优先权

时间:2011-08-29 18:00:54

标签: java exception exception-handling

我需要了解java异常处理优先级。

我有一个类Controller,它有一个NodeManager类,它有一个NameManager类。 NameManager有一个方法:

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

NodeManager类使用以下

中的上一个方法
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();
        }
    }

}

最后,类Controller使用以下

中的上一个方法
@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的nodeWriter()方法中的try-catch块能够执行异常。它发生的是控件返回到Controller类并执行其try-catch块。似乎throws HttpErrorException方法中的nodeWriter()语句优先于内部try-catch块。

有人能解释一下这样的异常处理优先系统吗?

2 个答案:

答案 0 :(得分: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的{​​{1}}将处理该异常。

答案 1 :(得分:1)

Throwable不会传播到处理该类Throwable的try / catch块之外。检查堆栈跟踪中的行号,这将告诉您Exception发生的确切位置。 (顺便提一下,一些java IDE有一个“分析堆栈跟踪”功能,允许你直接点击有问题的类和行号。我从来没有发现它有多大用处,但是这个功能存在,所以有人必须发现它很有用。 )