为什么错误没有被捕获,即使被明确抛出?

时间:2011-11-18 15:13:37

标签: java spring spring-mvc

我想使用带注释的“@ExceptionHandler”在SpringMVC3中捕获“错误”。我可以捕获throwable和任何异常,但是当我尝试使用“Error”时它没有捕获异常。知道为什么吗?下面的代码演示了这个问题。

@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 个答案:

答案 0 :(得分:4)

实际上我查看了Spring DispatcherServlet的源代码,在第809行中它解释了为什么无法处理Error

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

代码是Spring处理ExceptionResolvers可能是注释或基于bean的部分。你可以看到Spring只有一个例外而不是Throwable。错误不是Exception的子类,但是可抛出,所以你不能用Spring这样处理它。在相关的注释中,注释也称为@ExceptionHandler,因此它暗示它不会与错误一起使用。

答案 1 :(得分:1)

来自Error javadocs:

  

错误是Throwable的子类,表示严重问题   一个合理的应用程序不应该试图抓住。最多的   错误是异常情况。 ThreadDeath错误,虽然是   &#34;正常&#34; condition,也是Error的子类,因为大多数   应用程序不应该试图抓住它。

捕获错误(或任何其他不是Exception的子类的Throwable)是个坏主意。 Spring不支持Spring就是做正确的事。

答案 2 :(得分:0)

我也撞到了这个,从@ peter-szanto粘贴的代码中似乎没有办法用Spring注册的处理程序来处理java.lang.Error。我的用例是处理本地化页面的错误,并记录错误。我的解决方法是使用定义了错误页面/错误代码500的web.xml,并将错误页面/位置作为Spring处理的控制器(而不是JSP)以使本地化工作。缺点是当控制器代码运行时,当前用户没有身份验证。这也捕获了Spring无法处理的事情,就像错误的URI没有映射到Spring。

答案 3 :(得分:-1)

对我来说,下面适用于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
...
}

答案 4 :(得分:-2)

没意图处理Exception而不是Error?错误在Java中非常常用,并且只有很少的实现类。