SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常。

SpringMVC中默认是没有加装载HandlerExceptionResolver,我们需要在SpringMVC.xml中配置

<mvc:annotation-driven />

1、可以在Controller里面定义一个局部的异常处理方法(只处理该Controller下的异常)

/***    在这个方法中可以加入Exception类型的参数,该参数即对于发生的异常对象*    入参中不能传入map,若希望把异常信息传到页面上需要使用ModelAndView作为返回值 */@ExceptionHandler({NullPointerException.class})public String handlerNullPointerException(Exception ex){System.out.println("异常 : " + ex);return "error";}

该方法只会对该controller中的NullPointException异常捕获,若是想返回一个错误的提示页面,添加一个ModelAndView返回就好了

2、全局异常处理

①:自定义异常处理类需要实现HandlerExceptionResolver接口,然后再application.xml文件中注册这个bean

@Component

public class GlobalExceptionResolver implements HandlerExceptionResolver {/*** 对异常信息进行统一处理,区分异步和同步请求,分别处理*/public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {boolean isajax = isAjax(request,response);Throwable deepestException = deepestException(ex);return processException(request, response, handler, deepestException, isajax);}/*** 判断当前请求是否为异步请求.*/private boolean isAjax(HttpServletRequest request, HttpServletResponse response){return oConvertUtils.isNotEmpty(request.getHeader("X-Requested-With"));}}/*** 获取最原始的异常出处,即最初抛出异常的地方*/private Throwable deepestException(Throwable e){Throwable tmp = e;int breakPoint = 0;while(tmp.getCause()!=null){if(tmp.equals(tmp.getCause())){break;}tmp=tmp.getCause();breakPoint++;if(breakPoint>1000){break;}} return tmp;}/*** 处理异常.* @param request* @param response* @param handler* @param deepestException* @param isajax* @return*/private ModelAndView processException(HttpServletRequest request,HttpServletResponse response, Object handler,Throwable ex, boolean isajax) {//步骤一、异常信息记录到日志文件中.log.error("全局处理异常捕获:", ex);//步骤二、异常信息记录截取前50字符写入数据库中.
        logDb(ex);//步骤三、分普通请求和ajax请求分别处理.if(isajax){return processAjax(request,response,handler,ex);}else{return processNotAjax(request,response,handler,ex);}}private ModelAndView processAjax(HttpServletRequest request,HttpServletResponse response, Object handler,Throwable deepestException){ModelAndView empty = new ModelAndView();//response.setContentType("application/json");response.setHeader("Cache-Control", "no-store");AjaxJson json = new AjaxJson();json.setSuccess(true);json.setMsg(deepestException.getMessage());PrintWriter pw = null;try {pw=response.getWriter();pw.write(JSONHelper.bean2json(json));pw.flush();} catch (IOException e) {e.printStackTrace();}finally{pw.close();}empty.clear();return empty;}private ModelAndView processNotAjax(HttpServletRequest request,HttpServletResponse response, Object handler, Throwable ex) {String exceptionMessage = getThrowableMessage(ex);Map<String, Object> model = new HashMap<String, Object>();model.put("exceptionMessage", exceptionMessage);model.put("ex", ex);return new ModelAndView("common/error", model);}
}

②:注解@ControllerAdvice和@ExceptionHandler配合完成全局的异常捕获和处理返回

/*** @author SimpleWu* @ControllerAdvice:如果在当前Handler找不到当前方法出现的异常则将来这个注解标记的类中查找处理异常。* 意为定义一个全局异常*/
@ControllerAdvice
public class UserException {@ExceptionHandler({NullPointerException.class})public ModelAndView handlerNullPointerException(Exception ex){System.out.println("[异常] : " + ex);ModelAndView mav = new ModelAndView("error");mav.addObject("exception",ex);return mav;}
}

3、另外spring已经提供SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver

 Spring除了实现了一个DefaultHandlerExceptionResolver之外,还实现了一个SimpleMappingExceptionResolver,这两者都是继承自抽象类AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是实现了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出两个抽象方法,一个是在进行异常处理之前执行的方法prepareResponse(exception, response),一个是进行异常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顾名思义就是通过简单的映射关系来决定由哪个视图来处理当前的错误信息。SimpleMappingExceptionResolver提供了通过异常类型exceptionMappings来进行异常与视图之间的映射关系,提供了在发生异常时通过statusCodes来映射异常返回的视图名称和对应的HttpServletResponse的返回码。而且可以通过defaultErrorView和defaultErrorCode来指定默认值,defaultErrorView表示当没有在exceptionMappings里面找到对应的异常类型时就返回defaultErrorView定义的视图,defaultErrorCode表示在发生异常时当没有在视图与返回码的映射关系statusCodes里面找到对应的映射时默认返回的返回码。在使用SimpleMappingExceptionResolver时,当发生异常的时候,SimpleMappingExceptionResolver将会把当前的异常对象放到自身属性exceptionAttribute中,当没有指定exceptionAttribute时,exceptionAttribute就是用默认值exception。

以下是一个简单的例子:详情点击https://www.cnblogs.com/sunhaoyu/articles/5307496.html

(1)SpringMVC的servlet配置文件中申明一个SimpleMappingExceptionResolver bean,并通过配置属性exceptionMappings和defaultExceptionView来指定异常和视图的对应关系。

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="NumberFormatException">number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 --><prop key="NullPointerException">null</prop></props></property><property name="defaultErrorView" value="exception"/><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图--><property name="statusCodes"><!-- 定义在发生异常时视图跟返回码的对应关系 --><props><prop key="number">500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 --><prop key="null">503</prop></props></property><property name="defaultStatusCode" value="404"/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 --></bean>

转载于:https://www.cnblogs.com/Eeexiang/p/9725008.html

springMVC自定义全局异常相关推荐

  1. Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常

    文章目录 概述 未使用全局异常且未显式捕获异常的情况 使用全局异常 Step1. 自定义异常类 Step2. 封装异常信息模板 Step3. 全局异常处理类 Step4. 使用全局异常 小结 概述 我 ...

  2. SpringBoot 自定义全局异常处理器

    SpringBoot自定义全局异常处理器 一.maven依赖 二.GlobalExceptionHandler.java 三.ResponseStandard.java 四.logback.xml 五 ...

  3. SpringMVC构建全局异常处理器

    异常处理器 SpringMVC提供全局异常处理器进行统一的异常处理,一个系统只能有一个异常处理器. 系统的dao.service.controller层出现异常的时候都throws Exception ...

  4. SpringMVC实现全局异常处理器

    通过 @ControllerAdvice 注解,我们可以在一个地方对所有 @Controller 注解的控制器进行管理. 注解了 @ControllerAdvice 的类的方法可以使用 @Except ...

  5. python自定义全局异常_如何在python中进行全局异常捕获

    使用sys.excepthook函数进行全局异常的获取. 首先定义异常处理函数, 并使用该函数接收系统异常信息. import wx import sys class TestFrame(wx.Fra ...

  6. python自定义全局异常_Django 自定义404 500等错误页面的实现

    在开发网站的过程中,404,500错误,是不可避免产生的. 一旦产生了这种错误,很多可以通过web server 来处理.比如使用 apache 的定义 或者nginx 的定义.都可以定向处理.如果单 ...

  7. python自定义全局异常_flask中主动抛出异常及统一异常处理代码示例

    本文主要介绍的是flask中主动抛出异常及统一异常处理的相关内容,具体如下. 在开发时,后台出现异常 ,但不想把异常显示给用户或者要统一处理异常时,可以使用abort主动抛出异常,再捕获异常返回美化后 ...

  8. 自定义 thinkphp5.0全局异常报错,继承基类\exception解决

    情景介绍:url请求是get方式,此次报错是测试post请求,异常返回错误信息是否正确,结果异常返回信息有误,返回信息不正确. 以下下报错信息,显示  自定义全局异常报错信息是传入HttpExcept ...

  9. (转)SpringMVC学习(八)——SpringMVC中的异常处理器

    http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...

最新文章

  1. k-d tree树 近邻算法
  2. ECLIPSE配置MAVEN
  3. 设计和实现一个 Chrome 插件提升登录效率
  4. java定义基础变量语句_java语言基础-变量
  5. (总结)HTTP常见错误返回代码
  6. python-函数的返回值
  7. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
  8. C#中具有进程间通信的Singleton应用程序
  9. 扫地机器人 杂牌_国内扫地机器人哪个牌子好?
  10. 计算机原理 · 全加器
  11. 如何强制解锁或删除被占用的文件或文件夹 - ForceDelete绿色强制文件删除工具
  12. 51单片机LED灯闪烁
  13. Java项目:医疗管理系统 (java+Springboot+Maven+Mybatis-plus+Vue+Mysql)
  14. 【06月03日】预分红股息率最高排名
  15. 【原创】技术员 Ghost Win 10 X86 企业贺岁版2018
  16. Set? set和Set set的区别?
  17. Excel删除文本中任意位置所有空格的3种方法比较
  18. linux shell脚本攻略 第三章 以文件之名 find,chmod,touch,head,tail,tree,wc
  19. Java(回文数--一种比较简单的写法)
  20. Django实现分页功能

热门文章

  1. CssGaga 快速上手指南
  2. c# 一些控件常用屬性
  3. linux内存管理和原理分析
  4. Asp.Net 动态生成验证码
  5. 程序员的自我修养--链接、装载与库笔记:内存
  6. libyuv库的使用
  7. 设计模式之观察者模式(Observer)摘录
  8. matlab画复变函数,科学网—复数复变函数的Matlab计算与绘图 - 周铁戈的博文
  9. c语言基础习题下载,C语言基础题目
  10. c语言switch不允许实型,C语言中switch语句什么意思