Spring-MVC开发之全局异常捕获全面解读-阿里云开发者社区

开发者社区> wqnmbdd> 正文

Spring-MVC开发之全局异常捕获全面解读

简介: 【本文转载于Spring-MVC开发之全局异常捕获全面解读】 异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种, WEB.XML,就是指定error-code和page到指定地址,这也是最
+关注继续查看

【本文转载于Spring-MVC开发之全局异常捕获全面解读

异常,异常

我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个!

产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息!

在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种,

  1. WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法

  2. 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等。

SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉

互相没有依赖,每个都可单独使用!

定义服务器错误WEB.XML整合Spring MVC

web.xml

<error-page>
    <error-code>404</error-code>
    <location>/404</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500</location>
</error-page>

<!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 -->
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/uncaughtException</location>
</error-page>

applicationContext.xml

<!-- 错误路径和错误页面,注意指定viewResolver -->
<mvc:view-controller path="/404" view-name="404"/>
<mvc:view-controller path="/500" view-name="500"/>
<mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>

Spring全局异常,代码入侵方式

异常抛出

@Controller
public class MainController {
    @ResponseBody
    @RequestMapping("/")
    public String main(){
        throw new NullPointerException("NullPointerException Test!");
    }
}

异常捕获

//注意使用注解@ControllerAdvice作用域是全局Controller范围
//可应用到所有@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler
@ControllerAdvice
public class AControllerAdvice {
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public String handleIOException(NullPointerException ex) {
        return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
    }
}

Spirng全局异常,配置方式

异常抛出,同上!

异常捕获

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 默认错误页面,就是不在exceptionMappings指定范围内 -->
    <property name="defaultErrorView" value="uncaughtException" />
    <property name="exceptionMappings">
        <props>
            <!-- 异常类名,可以是全路径,错误页面或Controller路径! -->
            <prop key=".NullPointerException">NullPointerException</prop>
            <prop key="java.io.IOException">IOException</prop>
        </props>
    </property>
</bean>

Sping全局异常,自定义异常类和异常解析

自定义异常类:

public class CustomException extends RuntimeException {

    public CustomException(){
        super();
    }

    public CustomException(String msg, Throwable cause){
        super(msg, cause);
        //Do something...
    }
}

抛出异常

@ResponseBody
@RequestMapping("/ce")
public String ce(CustomException e){
    throw new CustomException("msg",e);
}

实现异常捕获接口HandlerExceptionResolver

public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("e", e);
        //这里可根据不同异常引起类做不同处理方式,本例做不同返回页面。
        String viewName = ClassUtils.getShortName(e.getClass());
        return new ModelAndView(viewName, model);
    }
}

配置Spring支持异常捕获

<bean class="cn.bg.controller.CustomHandlerExceptionResolver"/>

完!

参考:

[Spring MVC] - 500/404错误处理

Exception Handling in Spring MVC

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring 通过来AOP 实现前置,环绕,异常通知,注解(转)
本节主要内容:     1. Spring AOP前置通知案例     2. Spring AOP环绕通知案例     3. Spring AOP异常通知案例     4. Spring AOP注解使用案例   AOP是Aspect Oriented Programming的缩写,意思是面向方面...
1720 0
基于spring注解AOP的异常处理
一、前言   项目刚刚开发的时候,并没有做好充足的准备。开发到一定程度的时候才会想到还有一些问题没有解决。就比如今天我要说的一个问题:异常的处理。写程序的时候一般都会通过try...catch...finally对异常进行处理,但是我们真的能在写程序的时候处理掉所有可能发生的异常吗? 以及发生异常的时候执行什么逻辑,返回什么提示信息,跳转到什么页面,这些都是要考虑到的。
878 0
Springboot自定义异常处理
1.自定义异常类 import lombok.Data; @Data public class UserException extends RuntimeException { private Long id; public UserException(Long id) { super("user not exist"); this.
1223 0
【转】VC++/MFC(VC6)开发技术精品学习资料下载汇总 (2011.3.10更新)
from:http://club.topsage.com/thread-361504-1-1.html   Visual C++ (VC) / MFC 电子书下载:Visual C++ 2008 入门经典 (中文版) 下载Windows核心编程 第5版 (Windows via C/C++, 5...
2478 0
Asp.net MVC 3 开发一个简单的企业网站系统
最近我想把我学过的一些东西进行一下整合,来验证我最近学习的效果,所以我决定做一个简单的可以实现基本功能的Asp.net MVC 3 的企业网站系统,因为我的美术功底比较差,所以界面做出来可能会很丑陋。 现在我列一下可能会用到的技术以及可能采取的方式:如果有需要,还会继续添加 首先就是 Asp.net MVC 3框架,这时我研究了很长时间的一个框架结构。
879 0
《阿里巴巴Java Spring Boot 2.0开发实战课程》05课:三层MVC网站与架构分层误区、Java面试题
本期分享主题:三层架构MVC网站与分层架构误区、Java面试题,国内系统架构设计的文章和书籍。经常会搞错分层的概念,本课程进行了讲解。还有关于model概念的解析,以及Java Spring Boot2.0面试题。 另外java是免费的!
3227 0
Asp.net MVC 3 开发简单的企业系统开篇--数据库
本来准备自己做一个单独的系统(Asp.net MVC 3 开发一个简单的企业网站系统)玩一玩,没想到引来了大家的关注,令我非常激动啊,在这里非常感谢支持鼓励我的朋友们、园友们,谢谢您们。 虽然是要做一个简单的网站系统来练习一个主流的框架的使用,好让我自己更加熟悉自己的缺陷,看到大家的热情。
722 0
【ASP.NET】Webform与MVC开发比较
<span style="font-family:楷体; font-family:楷体; font-size:19px; line-height:27px; widows:auto">    去年暑假开始,跟着一个项目,开始接触到了MVC,那时候,自己对Webform的开发还没有在项目中真正实践过,没有什么过渡,就跳跃到MVC开发下了。而最近,在维护的一个项目中,并没有使用MVC开发,用的
2336 0
+关注
106
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载