博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC 异常处理优解
阅读量:6688 次
发布时间:2019-06-25

本文共 2840 字,大约阅读时间需要 9 分钟。

Spring MVC 异常处理有3种方式
1.Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2.Spring MVC异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3.@ExceptionHandler注解实现异常处理;
 
第一种方式:使用SimpleMappingExceptionResolver能够准确显示定义的异常处理页面,进行异常处理,具有集成简单、有良好的扩展性,因为是基于配置的对已有的代码没有侵入性等优点。但是该方法仅仅能够获取到异常信息,对于其他数据的情况不适用。
第二种方式:使用实现HandlerExceptionResolver接口的异常处理进行异常处理,具有集成简单、良好的扩展性、对已有代码没有侵入性等优点。同时由于自定义实现,我们可以在处理异常时进行额外的处理(日志的记录、异常信息的国际化等)。
第三种方式:使用注解方式实现异常处理,同样十分灵活,不过这种方式需要在每个controller上都需注解,解决方案是增加一个BaseController类,使用@ExceptionHandler注解声明异常处理,其他controller都继承它。
 
综合考虑,第二种、第三种方式比较实用,可以返回json结构数据,而且可以良好的处理异常,并对现有代码没有侵入性,但需要对每一个controller实现它的方法
 
现有系统中已经使用第二种@ExceptionHandler注解实现异常处理,故而采用在此基础上加入异常处理、返回异常信息,并加入日志处理,再配合使用error-page即可,所以运行时异常不需要在控制器里面 try catch。
 
使用方式:
第一步:BaseController实现异常处理、日志处理,每个Controller继承BaseController。
BaseController代码:
public abstract class BaseController {  private static final Logger log = LoggerFactory.getLogger(BaseController.class);  @ExceptionHandler  public ModelAndView exception(HttpServletRequest request, Exception ex) {  //简短的错误信息    String errInfo = "";    // 根据不同的异常类型进行不同处理    if (ex instanceof DataAccessException) {      errInfo = "数据库操作失败!";    } else if (ex instanceof NullPointerException) {      errInfo = "调用了未经初始化的对象或者是不存在的对象!";    } else if (ex instanceof IOException) {      errInfo = "IO异常!";    } else if (ex instanceof ClassNotFoundException) {      errInfo = "指定的类不存在!";    } else if (ex instanceof ArithmeticException) {      errInfo = "数学运算异常!";    } else if (ex instanceof ArrayIndexOutOfBoundsException) {      errInfo = "数组下标越界!";    } else if (ex instanceof IllegalArgumentException) {      errInfo = "方法的参数错误!";    } else if (ex instanceof ClassCastException) {      errInfo = "类型强制转换错误!";    } else if (ex instanceof SecurityException) {      errInfo = "违背安全原则异常!";    } else if (ex instanceof SQLException) {      errInfo = "操作数据库异常!";    } else if (ex.getClass().equals(NoSuchMethodError.class)) {      errInfo = "方法末找到异常!";    } else if (ex.getClass().equals(InternalError.class)) {      errInfo = "Java虚拟机发生了内部错误";    } else {      errInfo = "程序内部错误,操作失败!" ;    }     // 添加自己的异常处理逻辑,如日志记录    log.debug("异常信息:" + errInfo, ex);    Map
attributes = new HashMap
();    attributes.put("code", 0);    attributes.put("msg", "抱歉,请稍后重试或联系管理员!");    FastJsonJsonView view = new FastJsonJsonView();    view.setAttributesMap(attributes);    ModelAndView result = new ModelAndView();    result.setView(view);    return result;  }}

 

 
第二步:web.xml中加入错误页处理
java.lang.Throwable
/500.jsp
500
/500.jsp
404
/404.jsp

 

转载于:https://www.cnblogs.com/mirwangsir/p/5315183.html

你可能感兴趣的文章
android自定义radiobutton样式文字颜色随选中状态而改变
查看>>
【CodeForces 604B】F - 一般水的题1-More Cowbe
查看>>
wxPython 4.0.0b2安装
查看>>
Android RecyclerView利用Glide加载大量图片into(Target)导致OOM异常
查看>>
UGUI表情系统解决方案
查看>>
HTTP Health Checks
查看>>
为什么正态分布如此普遍
查看>>
jQuery事件
查看>>
轻松看懂Java字节码
查看>>
AE TIN的切割
查看>>
ASP.NET图片上传,删除
查看>>
2016第42周五
查看>>
架构师必看-架构之美第14章-两个系统的故事:设计之城(一)
查看>>
Hessian HTTP POST访问时,Nginx返回411问题
查看>>
Exif图片方向的一些发现
查看>>
iOS之传值
查看>>
pandas 修改 DataFrame 列名
查看>>
《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
查看>>
Nervos 双周报第 3 期:佛系新年之后的开工大吉!
查看>>
【PHP 扩展开发】Zephir 基础篇
查看>>