我想使用带注释的“@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();
}
}
答案 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中非常常用,并且只有很少的实现类。