首页 > 其他分享 >全局异常处理(容易忘在这里记录下)

全局异常处理(容易忘在这里记录下)

时间:2023-02-07 16:55:38浏览次数:45  
标签:exception return 记录 ApiResult ERROR result error 全局 异常



/**
* 全局异常处理类,能够处理到controller、filter、interceptro所抛出的异常
* 不使用HandlerExceptionResolver、结合两者使用(ControllerAdvice|ErrorController)
*/
@RestControllerAdvice
@Controller
public class GlobleAdviceAndErrorController implements ErrorController {

Logger logger = LoggerFactory.getLogger(this.getClass());

public static final String ERROR_PATH="/error";

@RequestMapping(ERROR_PATH)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public ApiResult<Object> error(HttpServletRequest request, HttpServletResponse response) {

//获取错误信息
Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");
Throwable exception = (Throwable) request.getAttribute("javax.servlet.error.exception");
// Object servlet_name = request.getAttribute("javax.servlet.error.servlet_name");
// Object message = request.getAttribute("javax.servlet.error.message");
// String uri = (String) request.getAttribute("javax.servlet.error.request_uri");


if (status > 400 && status < 500) {
response.setStatus(200);
return ApiResult.error(status.toString(), "请求无效");
}
if (exception==null){
return ApiResult.error(status.toString(), "请求无效");
}
if (status == 400) {
return ApiResult.error(status.toString(), exception.getMessage());
}

return buildErrorResult(exception);
}

@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public ApiResult<Object> handleExeption(Exception ex) {
return buildErrorResult(ex);
}

//处理自定义(业务逻辑错误)异常,不需要记录日志
@ExceptionHandler(BaseException.class)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public ApiResult<Object> handleBaseExeption(BaseException ex) {
logger.error("业务异常code:{},{}",ex.getCode(),ex.getMessage());
return new ApiResult<>(ex.getCode(),ex.getMessage());
}

private ApiResult<Object> buildErrorResult(Throwable exception) {
ApiResult result = new ApiResult();
String err_code = java.util.UUID.randomUUID().toString();

//返回值
if (exception != null) {
BaseException baseException = null;
if (exception instanceof BaseException) {
baseException = (BaseException) exception;
} else if (exception.getCause() instanceof BaseException) {
baseException = (BaseException) exception.getCause();
}else if (exception instanceof MethodArgumentNotValidException){
baseException= new BaseException(ExceptionCodeEnum.PARAMETER_ERROR.getCode(),exception.getMessage());
} else if (exception.getCause() instanceof RuntimeException) {
//baseException = new BaseException(ResultCodeEnum.SERVER_INTERNAL_ERROR.getCode() + "", exception.getCause().getMessage());
baseException = new BaseException(ResultCodeEnum.SERVER_INTERNAL_ERROR.getCode() + "", "编号[" + err_code + "]");
} else {
baseException = new BaseException(ResultCodeEnum.SERVER_INTERNAL_ERROR.getCode() + "", "编号[" + err_code + "]");
}

result.setCode(baseException.getCode());
result.setMessage(baseException.getMessage());
} else {
result.setCode(ResultCodeEnum.SERVER_INTERNAL_ERROR.getCode());
}
result.setData("编号[" + err_code + "]");

recodeExceptionLog(result, exception);

return result;
}



/**
* 记录错误日志
*
* @param result
* @param exception
*/
private void recodeExceptionLog(ApiResult<Object> result, Throwable exception) {
String errorMsg = "错误日志:";
errorMsg += result.getCode() + ";" + result.getMessage() + "\r\n";
errorMsg += result.getData();
errorMsg += exception.getStackTrace()[0];
logger.error(errorMsg,exception);
}

/**
* 校验错误拦截处理
*
* @param exception 错误信息集合
* @return 错误信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult validationBodyException(MethodArgumentNotValidException exception){
BindingResult result = exception.getBindingResult();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
//取第一个
String message = errors.stream().map(e -> ((FieldError) e).getDefaultMessage()).filter(e->!StringUtils.isEmpty(e)).findFirst().get();
if (!StringUtils.isEmpty(message)){
return ApiResult.error(ExceptionCodeEnum.PARAMETER_ERROR,message);
}
}
return ApiResult.error(ExceptionCodeEnum.PARAMETER_ERROR,"请填写正确信息");
}

/**
* 参数类型转换错误
*
* @param exception 错误
* @return 错误信息
*/
@ExceptionHandler(HttpMessageConversionException.class)
public ApiResult parameterTypeException(HttpMessageConversionException exception){
logger.error("参数类型转换错误",exception);
//logger.error(exception.getCause().getLocalizedMessage()!=null?exception.getCause().getLocalizedMessage():exception.getMessage());
return ApiResult.error(ExceptionCodeEnum.PARAMETER_ERROR);
}


@Override
public String getErrorPath() {
return ERROR_PATH;
}
}

标签:exception,return,记录,ApiResult,ERROR,result,error,全局,异常
From: https://www.cnblogs.com/javalbb/p/17099029.html

相关文章

  • 65、商城业务---异步---CompletableFuture完成回调与异常感知
    importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.c......
  • Openssh升级记录
    执行升级前备份文件cp-r/etc/ssh /etc/ssh_bakcp/etc/init.d/sshd /etc/init.d/sshd_bakcp/usr/sbin/sshd /usr/sbin/sshd_bak一、查看openssl 1、查看opens......
  • P3203做题记录
    一种更简单的想法,只用用分块思想(或者根号分治?)不用分块。先考虑暴力怎么做:修改直接改,查询不停跳下一个点。但这样会被卡到\(O(n^2)\)。考虑分块思想优化:如果保证每次至少......
  • webrtc windows编译记录
    //cmdsetpath=D:\zzh\depot_tools;%path%setDEPOT_TOOLS_WIN_TOOLCHAIN0setvs2022_install=C:\ProgramFiles\MicrosoftVisualStudio\2022\Community//powershe......
  • url 拼接异常
    异常url:  可以看出拼接了两个url 经排查: 是前端app.js中前端的baseUrl=后拼接的格式异常如下图,少了两个左斜杠,应该为http://192.168.15.102 ......
  • 手机微信聊天记录怎么打印出来?
    微信是绝大多数人最常用的聊天工具软件之一,无论是家人、朋友、同事,还是老师和家长都会使用微信来沟通和交流。而有不少网友想要找某件事情的记录时,也会使用微信来搜索聊天......
  • 20230207 物料关联车型报表 问题记录
    1.写sql的时候,主次没分清楚,应该是从marc和t001w表中查数据,剩下的字段再从其他的表中查,但是我直接是把lips和这两张表内连接到一块了,然后遇到lips表中没有的数据,就直接没数......
  • 【踩坑记录】@Transactional注解回滚不生效问题
    @Transactional属于是Spring的常用事务处理注解了,最近在开发时偶然发现这个东西竟然不是100%生效的。问题重现:测试一个批处理方法,方法上加了@Transactional后执行,因为加......
  • CompletableFuture 捕获异常方式:handle、whenComplete、exceptionally
    使用CompletableFuture编写代码时,异常处理很重要。CompletableFuture提供了三种方法来处理它们:handle()、whenComplete()和exceptionly()。  handle()whenCo......
  • Qt 项目架构之一:全局类说明
    这里讲解一些全局类,一般都放在Util这个文件夹内。Util是工具的意思,一般来说,常常用来描述和业务逻辑没有关系的数据处理。一、全局配置文件全局配置文件管理类AppConf......