一、应用场景

  当程序出现错误时,我们不希望页面直接返回“404”、“500”等信息,为了提高用户体验,我们需要统一处理异常,进行友好的提示!

二、异常分类

  (1)统一异常处理:推荐,只要出现异常,返回统一结果。

  (2)特殊异常处理:一般不使用,因为无法准确定位到项目的异常。

  (3)自定义异常处理:自己创建异常,实现返回结果,需要手动调用(try...catch)才会执行!

三、实现代码

   异常实现的底层原理AOP(面向切面编程),即不改变原有的代码,实现某个功能。

  <font color=red>注意:特殊异常处理的优先级高于统一异常处理!</font>

/** * @BelongProjecet: guli-framework-parent * @BelongPackage: com.guliedu.eduservice.handler * @ClassName: GlobalExceptionHandler * @Description: 【推荐>方式一】统一异常处理:只要出现异常,返回统一结果 * 【方式二】特殊异常处理:如果出现ArithmeticException异常,才会处理 * 特殊异常处理>统一异常处理(优先级) * 【推荐>方式三】自定义异常处理:自己创建异常,自己实现返回结果 * @Copyright: 2019-xxx-Powered by 研发四部 * @Author: LinHong * @CreateDate: 2019/11/13 20:42 * @Version: V1.0 */@ControllerAdvicepublic class GlobalExceptionHandler { /** * 功能描述 * * @MethodName: * @MethodParam: * @Return: * @Description: 处理全局异常的方法 * @Author: LinHong * @CreateDate: 2019/11/13 20:47 */ @ExceptionHandler(Exception.class) @ResponseBody public R error(Exception e) { e.printStackTrace(); return R.error().message("执行了全局异常处理方法......"); } /** * 功能描述 * * @MethodName: error * @MethodParam: [e] * @Return: com.guliedu.common.R * @Description: 处理特殊异常的方法 * @Author: LinHong * @CreateDate: 2019/11/13 20:52 */ @ExceptionHandler(ArithmeticException.class) @ResponseBody public R error(ArithmeticException e) { e.printStackTrace(); return R.error().message("执行了特殊异常处理方法......"); } /** * 功能描述 * @MethodName: error * @MethodParam: [e] * @Return: com.guliedu.common.R * @Description: 自定义异常--需要手动抛出异常!!! * @Author: LinHong * @CreateDate: 2019/11/14 10:05 */ @ExceptionHandler(EduException.class) @ResponseBody public R error(EduException e) { // EduException e1 = new EduException(20001,"自定义异常测试,操作失败......"; e.printStackTrace(); return R.error().code(e.getCode()).message(e.getMsg()); }}

EduException自定义异常类

继承运行时异常类,添加两个属性即可:状态码、返回信息。

/** * @BelongProjecet: guli-framework-parent * @BelongPackage: com.guliedu.eduservice.handler * @ClassName: EduException * @Description: 自定义异常 * @Copyright: 2019-xxx-Powered by 研发四部 * @Author: LinHong * @CreateDate: 2019/11/14 9:58 * @Version: V1.0 */@Data//无参构造@NoArgsConstructor//有参构造@AllArgsConstructorpublic class EduException extends RuntimeException{ //状态码 private Integer code; //返回信息 private String msg;}

(自定义异常测试)异常位置

注意:自定义异常需要手动调用,才会执行!

/** *测试特殊异常 ArithmeticException */ try { int i =666/0; } catch (Exception e) { //抛出自定义异常 throw new EduException(20001,"自定义异常测试,执行此操作......."); }

R 返回结果类(附)

/** * @BelongProjecet: guli-framework-parent * @BelongPackage: com.guliedu.common * @ClassName: R * @Description: 返回结果类--链式编程 * @Copyright: 2019-xxx-Powered by 研发四部 * @Author: LinHong * @CreateDate: 2019/11/13 14:32 * @Version: V1.0 */@Datapublic class R { private boolean success; private Integer code; private String message; private Map<String, Object> data = new HashMap<>(); //构造方法私有化 private R(){} //对外提供可以访问方法 public static R ok(){ R r = new R(); r.setSuccess(true); r.setCode(ResultCode.OK); r.setMessage("成功"); return r; } public static R error(){ R r = new R(); r.setSuccess(false); r.setCode(ResultCode.ERROR); r.setMessage("失败"); return r; } public R message(String message){ this.setMessage(message); return this; } public R code(Integer code){ this.setCode(code); return this; } public R data(String key, Object value){ this.data.put(key, value); return this; } public R data(Map<String, Object> map){ this.setData(map); return this; }}

ResultCode数据状态码接口(附)

package com.guliedu.common;/** * @BelongProjecet: guli-framework-parent * @BelongPackage: com.guliedu.common * @ClassName: ResultCode * @Description: 编写统一结果返回,创建公共模块--定义返回数据状态码 * @Copyright: 2019-xxx-Powered by 研发四部 * @Author: LinHong * @CreateDate: 2019/11/13 14:20 * @Version: V1.0 */public interface ResultCode { //成功 int OK = 20000; //失败 int ERROR =20001; //用户名或密码错误 int LOGIN_ERROR =20002; //权限不足 int ACCEAA_ERRORR=20003; //远程调用失败 int REMOTE_ERROR = 20004; //重复操作 int REPEAT_ERROR = 20005;}

♚学习、实战、总结、分享,让生活变得更美好!
☞林大侠CSDN博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流探讨!