# 异常处理

HOS基础平台拥有全局异常处理机制,无论是开发平时常见的异常还是自定义异常都可以使用全局异常机制处理返回固定格式内容。全局异常处理机制详见基础包hos-framework-base-starter下的com.mediway.hos.base.exception.ExceptionHandlerAdvice。 原则上每个业务模块创建一个自定义异常类和一个错误码枚举, 下面以自定义员工业务异常来演示该处理机制。

1.自定义员工业务异常,在模块oa-user-servicecom.mediway.hos.user.exception包下创建StaffException,该异常需继承基础业务异常类BaseBusinessException

package com.mediway.hos.exception;

import com.mediway.hos.base.exception.BaseBusinessException;
import com.mediway.hos.base.exception.BaseExceptionEnum;

/**
 * 自定义员工异常
 */
public class StaffException extends BaseBusinessException {

    public StaffException(String message) {
        super(message);
    }

    public StaffException(BaseExceptionEnum baseEnum) {
        super(baseEnum);
    }

    public StaffException(String code, String message, Throwable cause) {
        super(code, message, cause);
    }

    public StaffException(String code, String message) {
        super(code, message);
    }
}

2.自定义员工异常状态枚举类,在模块oa-user-servicecom.mediway.hos.oa.enums包下创建StaffExceptionEnum,该枚举类需要实现基础异常枚举接口。

package com.mediway.hos.enums;

import com.mediway.hos.base.exception.BaseExceptionEnum;

/**
 * 员工异常返回结果状态枚举类
 */
public enum StaffExceptionEnum implements BaseExceptionEnum {
    STAFF_NOT_FIND("10000001","员工未找到");

    private String code;
    private String msg;

    StaffExceptionEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

3.在模块oa-user-servicecom.mediway.hos.user.service.StaffService中创建testException接口。

/**
 * 测试异常
 */
void testException();

4.在模块oa-user-servicecom.mediway.hos.user.service.impl.StaffServiceImpl中完成testException的方法实现,手动抛出刚自定义的员工业务异常。

/**
 * 测试异常
 */
public void testException() {
    throw new StaffException(StaffExceptionEnum.STAFF_NOT_FIND);
}

5.在模块oa-user-controllercom.mediway.oa.controller.user.StaffController中添加testException方法。

/**
 * 测试异常
 *
 * @return
 */
@ApiOperation(value = "测试异常")
@GetMapping("/testException")
public BaseResponse testException() {
    staffService.testException();
    return BaseResponse.success();
}

6.我们请求StaffControllertestException方法,该方法的作用是测试全局异常处理情况,接口的请求方式和响应结果如下

请求方式

url:http://localhost:8367/api/staff/testException
method:GET

响应结果

{
    "code":"10000001",
    "msg":"员工未找到",
    "data":null,
    "success":false
}

可见全局异常机制对我们抛出的异常进行了拦截包装,返回了规范的json格式数据。