一、应用场景
当程序出现错误时,我们不希望页面直接返回“404”、“500”等信息,为了提高用户体验,我们需要统一处理异常,进行友好的提示!
二、异常分类
(1)统一异常处理:推荐,只要出现异常,返回统一结果。
(2)特殊异常处理:一般不使用,因为无法准确定位到项目的异常。
(3)自定义异常处理:自己创建异常,实现返回结果,需要手动调用(try…catch)才会执行!
三、实现代码
异常实现的底层原理AOP(面向切面编程),即不改变原有的代码,实现某个功能。
注意:特殊异常处理的优先级高于统一异常处理!
/**
* @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
*/
@ControllerAdvice
public 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
//有参构造
@AllArgsConstructor
public 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
*/
@Data
public 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;
}
♚学习、实战、总结、分享,让生活变得更美好!
☞林大侠博客:https://coding0110lin.blog.csdn.net/ 欢迎转载,一起技术交流探讨!