приоритет отлова выполнения - PullRequest
0 голосов
/ 29 августа 2011

Мне нужно понять приоритет обработки исключений 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();
        }
    }

}

и, наконец, контроллер класса использует предыдущий метод в следующем

@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, я ожидаю, что блок try-catch в методе nodeWriter() NodeManger будет выполнен с исключением. Случается так, что элемент управления возвращается в класс Controller и выполняется его блок try-catch. Похоже, что оператор throws HttpErrorException в методе nodeWriter() имеет приоритет над внутренним блоком try-catch.

Может кто-нибудь объяснить мне такую ​​систему приоритетов обработки исключений?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Throwable не распространяется за пределы блока try / catch, который обрабатывает этот тип Throwable. Проверьте номера строк в трассировке стека, и это точно скажет вам, где возникло исключение. (Между прочим, некоторые java IDE имеют функцию «анализировать трассировку стека», которая позволяет вам щелкать непосредственно по рассматриваемому классу и номеру строки. Я никогда не нашел для этого особого применения, но функция существует, поэтому кто-то должен был найти ее полезной. )

1 голос
/ 29 августа 2011

В своем коде вы упоминаете, что ваш 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()затем обработает это исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...