我正在使用以下通用类来处理我的应用程序中的所有类型的异常。它处理大多数异常,但无法处理某些异常,例如“org.apache.tiles.impl.CannotRenderException”。我怎样才能让它捕获所有类型的异常?
我使用的一些技术是:Spring 4.0.0.RELEASE、Tiles 2.2、Maven 1.6、Spring Webflow 2.4.0.RELEAS
@ControllerAdvice
class GenericDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error/error";
private static final String DEFAULT_ERROR_SUBJECT = "Exception occurred";
final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private MailService mailService;
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
throw e;
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
//send email to system admin
sendMessageToAdmin(e.toString(),req.getRequestURL().toString());
logger.error(e.toString());
return mav;
}
private void sendMessageToAdmin(String exceptionAsMessage, String url) {
try {
StringBuilder errorMessage = new StringBuilder();
errorMessage.append("Exception on request URL :");
errorMessage.append(url);
errorMessage.append("\n\n");
errorMessage.append("The Exception was: ");
errorMessage.append(exceptionAsMessage);
mailService.sendMailWithSubject(DEFAULT_ERROR_SUBJECT,errorMessage.toString());
} catch (Exception e) {
}
}
}
谢谢
最佳答案
问题是您的处理程序捕获了 Controller 中的异常,但在 Controller 完成其工作后,在 View 中抛出了平铺异常。您可以尝试使用过滤器来处理它们:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
...
try {
chain.doFilter(request, response);
}
catch (Exception ex) {
// your stuff
...
throw new ServletException(ex);
}
}
独立于此(或另外),您还可以要求容器在发现异常时或当 Controller 使用 sendError
以及 web.xml 中的某些配置时使用某些 View
文件:
<!-- error-code related error pages -->
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/ErrorHandler</location>
</error-page>
<!-- exception-type related error pages -->
<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type >
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type >
<location>/ErrorHandler</location>
</error-page>
关于java - Spring MVC 通用异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108271/