异常处理

作者: 荒天帝886 | 来源:发表于2019-07-04 12:12 被阅读0次

一、try - catch模型

try{
    //主动抛出的异常,被catch代码块抓获。
    if(StringUtils.equals("1", "2")){
        throw new ServiceException(-1, "数字不相等");
    }
} catch (ServiceException e){
    //抓获try代码块出现的异常并抛出,由调用者处理
    throw e;
} catch (Exception e){
    throw new SystemException(-1, "系统出现异常");
}

二、统一异常处理

背景

当我们定义了一个自定义返回参数格式时,希望得到统一的返回,如果在运行时发现了异常,也希望将异常统一返回。如期望返回格式:

{
    "status": "success",
    "code": 500,
    "success": false,
    "message": "id不能为空!"
}

配置

1. 自定义异常类ServiceExceptionSystemException
  • ServiceException
package com.fzy.javastudy.spring.config;

public class ServiceException extends RuntimeException {
    private final int code;
    private final String message;

    public ServiceException() {
        this.code = 20000;
        this.message = "System Error";
    }

    public ServiceException(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }
}
  • SystemException
package com.fzy.javastudy.spring.config;

public class SystemException extends RuntimeException {
    private final int code;
    private final String message;

    public SystemException() {
        this.code = 20000;
        this.message = "System Error";
    }

    public SystemException(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }
}
定义异常代处理类Api
package com.fzy.javastudy.spring.model;

public class Api {
    public static ApiResponse ok(Object item) {
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setItem(item);
        apiResponse.setCode(0);
        apiResponse.setStatus("success");
        apiResponse.setMessage("");
        return apiResponse;
    }

    public static ApiResponse ok(Object item, String message) {
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setItem(item);
        apiResponse.setCode(0);
        apiResponse.setStatus("success");
        apiResponse.setMessage(message);
        return apiResponse;
    }

    public static ApiResponse error(String message) {
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setItem(null);
        apiResponse.setCode(-1);
        apiResponse.setStatus("fail");
        apiResponse.setMessage(message);
        return apiResponse;
    }

    public static ApiResponse error(int code, String message) {
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setItem(null);
        apiResponse.setCode(code);
        apiResponse.setStatus("fail");
        apiResponse.setMessage(message);
        return apiResponse;
    }
}
配置统一异常处理类
package com.fzy.javastudy.spring.config;

import com.fzy.javastudy.spring.model.Api;
import com.fzy.javastudy.spring.model.ApiResponse;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 统一异常处理
 */
@RestControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ApiResponse handleException(Exception e) {
        return Api.error(ExceptionUtils.getMessage(e));
    }

    @ExceptionHandler(ServiceException.class)
    public ApiResponse handleServiceException(ServiceException e) {
        return Api.error(e.getCode(), e.getMessage());
    }

    @ExceptionHandler(SystemException.class)
    public ApiResponse handleSystemException(SystemException e) {
        return Api.error(e.getCode(), e.getMessage());
    }

}

相关文章

网友评论

    本文标题:异常处理

    本文链接:https://www.haomeiwen.com/subject/qqplhctx.html