## 后台异常处理
在开发过程中,不可避免的是需要处理各种异常,异常处理方法随处可见,所以代码中就会出现大量的`try {...} catch {...} finally {...}` 代码块,不仅会造成大量的冗余代码,而且还影响代码的可读性,所以对异常统一处理非常有必要。为此,我们定义了一个统一的异常类`YamiShopBindException` 与异常管理类 `DefaultExceptionHandlerConfig`。
我们先来看下 `YamiShopBindException`的代码
```java
public class YamiShopBindException extends RuntimeException {
private static final long serialVersionUID = -4137688758944857209L;
/**
* http状态码
*/
private Integer httpStatusCode;
/**
* @param httpStatus http状态码
*/
public YamiShopBindException(YamiHttpStatus httpStatus) {
super(httpStatus.getMsg());
this.httpStatusCode = httpStatus.value();
}
/**
* @param httpStatus http状态码
*/
public YamiShopBindException(YamiHttpStatus httpStatus, String msg) {
super(msg);
this.httpStatusCode = httpStatus.value();
}
public YamiShopBindException(String msg) {
super(msg);
this.httpStatusCode = HttpStatus.BAD_REQUEST.value();
}
public Integer getHttpStatusCode() {
return httpStatusCode;
}
}
```
`YamiHttpStatus`为我们自定义的返回状态码的枚举类,定义为一个枚举类,更直观处理异常返回的状态码及异常内容,以后每增加一种异常情况,只需增加一个枚举实例即可,不用每一种异常都定义一个异常类。
```java
public enum YamiHttpStatus {
/**
* 客户端看到401状态码时,应该重新登陆
*/
UNAUTHORIZED(401, "未授权"),
COUPONCANNOTUSETOGETHER(601, "优惠券不能共用"),
;
private final int value;
private final String msg;
YamiHttpStatus(int value, String msg) {
this.value = value;
this.msg = msg;
}
public int value() {
return this.value;
}
public String getMsg() {
return msg;
}
public static YamiHttpStatus resolve(int statusCode) {
for (YamiHttpStatus status : values()) {
if (status.value == statusCode) {
return status;
}
}
return null;
}
}
```
再来看看 `DefaultExceptionHandlerConfig`类
```java
@Controller
@RestControllerAdvice
public class DefaultExceptionHandlerConfig {
@ExceptionHandler(YamiShopBindException.class)
public ResponseEntity<String> unauthorizedExceptionHandler(YamiShopBindException e){
e.printStackTrace();
return ResponseEntity.status(e.getHttpStatusCode()).body(e.getMessage());
}
}
```
## 前台异常处理
前端请求与相应做了封装,请求响应的内容会被拦截器所拦截,当后台返回给前台特定的状态码,前台将显示不同报错信息。请求响应非常常见,我们查看在`src\utils\httpRequest.js`里面的其中一段代码
```javascript
http.interceptors.response.use(response => {
return response
}, error => {
switch (error.response.status) {
case 400:
Message.error(error.response.data)
break
case 401:
clearLoginInfo()
router.push({ name: 'login' })
break
case 405:
Message.error('http请求方式有误')
break
case 500:
Message.error('服务器出了点小差,请稍后再试')
break
case 501:
Message.error('服务器不支持当前请求所需要的某个功能')
break
}
return Promise.reject(error)
})
```
这里将会统一拦截返回的状态码如`400`,进行错误提示。
## RESTful 风格
我们的上述代码使用http状态码对请求进行统一响应,其中最大的
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
[RESTful概述](https://blog.igevin.info/posts/restful-architecture-in-general/)
- 开发环境准备
- 基本开发手册
- 项目目录结构
- 权限管理
- 通用分页表格
- Swagger文档
- undertow容器
- 对xss攻击的防御
- 分布式锁
- 统一的系统日志
- 统一验证
- 统一异常处理
- 文件上传下载
- 一对多、多对多分页
- 认证与授权
- 从授权开始看源码
- 自己写个授权的方法-开源版
- 商城表设计
- 商品信息
- 商品分组
- 购物车
- 订单
- 地区管理
- 运费模板
- 接口设计
- 必读
- 购物车的设计
- 订单设计-确认订单
- 订单设计-提交订单
- 订单设计-支付
- 生产环境
- nginx安装与跨域配置
- 安装mysql
- 安装redis
- 传统方式部署项目
- docker
- 使用docker部署商城
- centos jdk安装
- docker centos 安装
- Docker Compose 安装与卸载
- docker 镜像的基本操作
- docker 容器的基本操作
- 通过yum安装maven
- 常见问题