项目中统一异常处理
2020-04-30 本文已影响0人
养一只tom猫
在开发时,难免各种if else代码判断用户请求是否包含***,那么我们如何让用户更清楚的知道自己要干什么,错在哪里了呢?
这时候就需要用到统一异常处理了!
为什么需要异常处理:就算后台异常了,也不能展示给用户看到,应该给用户一种友好提示,提高用户体验度。
如何处理:可使用全局异常处理器对异常进行处理。
可以看看如下代码:
/**
* 统一异常处理类
*/
@ControllerAdvice//声明该类是一个增强类
public class BaseExceptionHandler {
@ExceptionHandler(value = Exception.class)//Exception.class表示对所有异常进行处理
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return new Result(false,StatusCode.ERROR,"服务器太忙了,请您稍后重试");
}
}
上面的代码虽然对异常进行了处理,但是提示很单一,并且不够友好,虽然不会直接抛出异常信息被用户浏览到,但是提示信息太单一了。
那么我们如何给出用户更友好的提示?
可以自定义异常类,定义一个枚举对各种错误信息进行封装,@ExceptionHandler(value = MyException.class)在全局异常处理类中抓我们自定义的异常,然后获取异常信息,返回给前端。
MyException:是我们自定义的异常类,当用户在不满足某些条件时访问我们的接口,我们则抛出自定义异常。
public enum ExceptionResultCode {
TIMEOUT_EXCEPTION(100, "对不起,网络开小差了"),
PARAM_ERROR(101,"参数不合法"),
PASSWORD_ERROR(102,"密码错误"),
OTHER_ERROR(200,"未知错误,请联系管理员,管理员手机号码:*****(前两天和你吵过架的同事电话)");
//此处省略n种异常信息
private Integer code;
private String desc;
private ExceptionResultCode(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
自定义异常代码:
/**
* 自定义异常处理类
*/
public class MyBusinessException extends RuntimeException{
private ExceptionResultCode exceptionResultCode;
private MyBusinessException(ExceptionResultCode exceptionResultCode) {
this.exceptionResultCode = exceptionResultCode;
}
public ExceptionResultCode getExceptionResultCode() {
return exceptionResultCode;
}
public static MyBusinessException throwException(ExceptionResultCode exceptionResultCode){
throw new MyBusinessException(exceptionResultCode);
}
}
具体应用示例:
public void update(User user) {
if (userMapper.selectByPrimaryKey(user.getId()) == null){
MyBusinessException.throwException(ExceptionResultCode.PARAM_ERROR);
}
brandMapper.updateByPrimaryKey(brand);
}
这样就能给出用户更友好的提示了!