Почему ошибка не ловится, даже если явно выброшена? - PullRequest
3 голосов
/ 18 ноября 2011

Я хочу поймать «Ошибка» в SpringMVC3, используя аннотированный «@ExceptionHandler». Я могу поймать throwable и любое исключение, но когда я попытался с «Ошибка», это не ловит исключение. Есть идеи почему? Код ниже демонстрирует проблему.

@Controller
@RequestMapping("/test")
public class TestExceptionController {

static final Logger logger = Logger.getLogger(TestExceptionController.class);

    @RequestMapping(method = RequestMethod.GET)
    public String processData(int intValue) throws InvalidDataException {

        if (intValue < 6) {
            try {
                throw new Exception();
            } catch (Exception e) {
                throw new InvalidDataException();
            }
        }

        return "test";

    }

    @ExceptionHandler(InvalidDataException.class)
    public ModelMap handleException(InvalidDataException ex) {
        logger.debug("exception catched  :" + ex);

        return new ModelMap();

    }
}

Приведенный выше код ловит, но приведенный ниже код не ловит. Почему не ловит ошибку?

@Controller
@RequestMapping("/test")
public class TestExceptionController {

    static final Logger logger = Logger.getLogger(TestExceptionController.class);

    @RequestMapping(method = RequestMethod.GET)
    public String processData(int intValue) throws Error{

        if (intValue < 6) {
            try {
                throw new Exception();
            } catch (Exception e) {

                throw new Error();
            }
        }
        return "test";

    }

    @ExceptionHandler(Error.class)
    public ModelMap handleException(Error ex) {
        logger.debug("exception catched  :" + ex);

        return new ModelMap();

    }
}

Ответы [ 5 ]

4 голосов
/ 21 ноября 2011

На самом деле я посмотрел на источник пружинного DispatcherServlet и в строке 809 объясняется, почему Ошибка не может быть обработана

        catch (Exception ex) {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(processedRequest, response, handler, ex);
            errorView = (mv != null);
        }

Код - это та часть, где Spring обрабатывает ExceptionResolvers, может ли это быть на основе аннотации или на основе bean-компонента. Вы можете видеть, что Spring только содержит исключения, а не Throwable. Ошибка не является подклассом Исключения, но может быть выброшена, поэтому вы не сможете обработать ее с помощью Spring таким образом. В соответствующей заметке аннотацию также называют @ExceptionHandler, поэтому она подразумевает, что она не будет работать с ошибками.

1 голос
/ 16 ноября 2015

Из Error javadocs:

Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить.Большинство таких ошибок являются ненормальными условиями.Ошибка ThreadDeath, хотя и является «нормальным» условием, также является подклассом Error, поскольку большинству приложений не следует пытаться ее перехватить.

Catching Error (или любой другой Throwable, который не является подклассомИсключение) плохая идея.Spring делает правильные вещи, не поддерживая их.

0 голосов
/ 13 февраля 2014

Я тоже врезался в это, из кода, вставленного @ peter-szanto, похоже, нет возможности обработать java.lang.Error с помощью обработчика, зарегистрированного Spring. Мой вариант использования будет обрабатывать ошибку с локализованной страницей, а также регистрировать ошибку. Мой обходной путь - использовать web.xml с определенным значением error-page / error-code 500 и в качестве error-page / location контроллер с обработкой Spring (не JSP), чтобы получить работу по локализации. Недостатком является то, что при запуске кода контроллера аутентификация текущего пользователя отсутствует. Это также отлавливает то, что Spring не может обработать как неправильный URI, не сопоставленный с Spring.

0 голосов
/ 18 ноября 2011

Для меня ниже работает с Spring 3.0.5 MVC

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
    public NotFoundException() {
        super();
    }
}

 @ExceptionHandler
    @RequestMapping(method = RequestMethod.GET, value = "employee/{id}",
            headers = "Accept=application/json,application/x-protobuf,application/xml")
    public @ResponseBody method(xxxx)
{
..
throw new NotFoundException
...
}
0 голосов
/ 18 ноября 2011

не означало обрабатывать исключения вместо ошибокОшибка очень редко используется в Java и имеет очень мало реализующих классов.

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