一、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. 自定义异常类ServiceException
和SystemException
- 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());
}
}
网友评论