2011-11-18 55 views
3

我想在SpringMVC3中使用带注释的“@ExceptionHandler”来捕捉“错误”。我可以捕获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(); 

    } 
} 
+2

未来,请编辑您现有的问题,而不是创建一个新的问题。我已经投票结束了原文。 –

+0

您使用的是哪个版本的Spring3? – andyb

+0

这是否回答了您的问题:http://stackoverflow.com/questions/8184593/why-error-is-not-getting-caught-even-when-explicitly-thrown/8212177#8212177 –

回答

-2

没有打算处理异常而不是错误?错误在Java中非常严格地使用,并且有很少的实现类。

+0

断言是一个很好的例子错误。当我们更换一个jar而不更新其他jar时,我们也看到了一些生产中的类链接错误。 – Gray

+0

@Gray我不是说没有有效的情况来处理错误,我只是说它不是太常见。此外,调试消息指出“异常捕获”,异常处理程序方法称为handleException。如果他真的对Error感兴趣,那么它应该是“错误捕捉”和handleError? –

-1

对我来说,下面春的作品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

这与处理'Error'(不是'Exception')有什么关系? –

4

其实我看着春天的DispatcherServlet的来源和线809它解释了为什么错误无法处理

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

的代码是弹簧处理ExceptionResolvers可能是注释或基于bean的部分。你可以看到Spring只会憎恶Exception not Throwable。错误不是Exception的子类,而是可抛出的,所以你不能用这种方式处理它。在相关的注释中,注释也被称为@ExceptionHandler,所以它暗示它不适用于错误。

0

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

1

Error的javadoc:

一个错误是Throwable的子类,表示严重的问题 合理的应用程序不应该试图捕获。大多数这样的 错误都是异常情况。 ThreadDeath错误虽然是 “正常”条件,但也是Error的一个子类,因为大多数 应用程序不应该试图捕获它。

捕获一个错误(或任何其他不是异常的子类的Throwable)是一个坏主意。春天不支持它是正确的。

+1

我**完全不同意**,声明“Spring不支持它正在做正确的事情”。正如前面提到的Javadocs,*大多数应用程序不应该试图捕获错误*,但这实际上意味着**有这些应该被捕获的合理情况**,所以Spring根本不支持边界情况。 **这种**合理的情况的一个简单的**例子就是这种例外的基本日志记录**,而且这种情况目前不可能使用Spring,因此我将其看作是**的一个**体系结构缺陷。 – Yura

+0

在运行时可能发生并且应该记录的错误的另一个例子是** UnsatisfiedLinkError ** - https://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html,哪些**只能在运行时检测到**和**应该被正确记录**。这个错误通常不会导致整个JVM的崩溃,而是会影响使用动态库的部分功能,并且是为记录目的应该捕获的错误的完美示例,以及Web应用程序继续工作之后的错误一般。 – Yura

相关问题