文章积累知识,如有存在问题,请大家不啬赐教
前文:之前写了一篇浅谈代码规范的文章,文章地址:https://blog.csdn.net/tang_sy/article/details/115002158
看官会觉得controller满屏的try-catch,似乎心情会不爽,想到能不能全局处理异常,不再是service抛出异常,controller处理异常,也就是说开发者不关注异常处理,自定义异常直接在service抛出
我从来没见过这么嚣张的人,哎!你今天就见到了
package com.hzw.sunflower.common;
import com.hzw.sunflower.constant.GeneralConstants;
import com.hzw.sunflower.constant.MessageConstants;
import com.hzw.sunflower.exception.SunFlowerException;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.ResourceNotFoundException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
/**
* 统一异常处理类
*
* @author YHD
* @version 1.0.0 2021-03-31
*/
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerAdvice {
/**
* 底层的全局异常处理方法
*
* @param e Throwable
* @return 异常结果数据
*/
@ExceptionHandler(Throwable.class)
public Result<?> throwableErrorHandler(Throwable e) {
log.error(e.getMessage(), e);
return Result.error(e.getMessage(), e);
}
/**
* 默认的全局异常处理方法
*
* @param e Exception
* @return 异常结果数据
*/
@ExceptionHandler(Exception.class)
public Result<?> defaultErrorHandler(Exception e) {
log.error(e.getMessage(), e);
return Result.error(e.getMessage(), e);
}
/**
* 运行时异常处理方法
*
* @param e RuntimeException
* @return 异常结果数据
*/
@ExceptionHandler(RuntimeException.class)
public Result<?> runtimeExceptionHandler(RuntimeException e) {
log.error(e.getMessage(), e);
return Result.error(MessageConstants.MESSAGE_SERVER_ERROR, e);
}
/**
* Bean Validation字段验证的异常处理方法
*
* @param e MethodArgumentNotValidException
* @return 异常结果数据
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
return Result.failed(e.getBindingResult().getFieldError().getDefaultMessage());
}
/**
* Bean Validation字段验证的异常处理方法
*
* @param e BindException
* @return 异常结果数据
*/
@ExceptionHandler(BindException.class)
public Result<?> bindExceptionHandler(BindException e) {
return Result.failed(e.getBindingResult().getFieldError().getDefaultMessage());
}
@ExceptionHandler(SunFlowerException.class)
public Result<?> bindExceptionHandler(SunFlowerException e) {
return Result.errorCode(e.getExceptionEnum().getCode(), e.getExceptionEnum().getMessage(), e);
}
/**
* 上传文件的总大小超过maxUploadSize配置的大小时的异常处理方法
*
* @param e MaxUploadSizeExceededException
* @return 异常结果数据
*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public Result<?> maxUploadSizeExceededException(MaxUploadSizeExceededException e) {
long size = e.getMaxUploadSize() / GeneralConstants.FILE_SIZE / GeneralConstants.FILE_SIZE;
return Result.failed(MessageConstants.UPLOAD_TOO_LARGE + size + MessageConstants.FILE_UNIT_M);
}
/**
* 获取路径错误
*
* @param e
* @return
*/
@ExceptionHandler(ResourceNotFoundException.class)
public Result<?> resourceNotFoundException(ResourceNotFoundException e) {
return Result.failed(MessageConstants.NOT_FOUND, e.getMessage());
}
}
SunFlowerException是项目自定义异常,可参照开头文章地址查看,这样就完美解决controller补货并处理异常,统一处理是不是很方便