spring框架做全局异常捕获_SpringBoot实现优雅的全局异常处理

欢迎来到阿八个人博客网站。本

阿八个人博客

网站提供最新的站长新闻,各种互联网资讯。

喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术!

URL链接:https://www.abboke.com/grfx/253043.html

烦不胜烦的try...catch和不知所"错"的500页

在我曾经遇到的一些项目中,在写controller层的时候,对于ajax请求,总是得在代码前后加上try...catch,然后返回一些异常信息,打上日志,每个请求都得写,烦不胜烦,更可怕的是返回视图,甚至连try...catch都省了,一旦发生错误,看到的只能是500错误页,出错时只能一脸懵逼,根本不知道出了什么问题,非常难以排查,其实这就是当时搭框架和写代码时的考虑不周了,要知道对于程序员来说,工作的大部分内容都是在写BUG和处理BUG,如果在出现问题时,甚至不知道问题在哪里,那简直就是噩梦了。本文将就如何优雅的实现全局异常处理,谈谈自己的处理方式。

使用@ControllerAdvice实现全局异常处理

在SpringBoot中,可以使用@ControllerAdvice实现全局异常处理。

新建一个GlobalExceptionHandler类用于处理全局异常。这里省略SpringBoot工程的搭建,话不多说,直接上代码(使用了lombok,hutool,fastjson等工具):@ControllerAdvice

@Slf4j

publicclassGlobalExceptionHandler{

@ExceptionHandler(value=Exception.class)

publicModelAndViewdefaultErrorHandler(HttpServletRequestrequest,HttpServletResponseresponse,Exceptionerror){

booleanajax=HeaderUtil.isAjaxRequest(request);

StringerrorMark=IdUtil.simpleUUID();

if(ajax){

JSONObjectjson=newJSONObject();

//错误识别码

json.put("error_code",500);

json.put("error_msg","服务器内部错误,请复制错误识别码并联系站长!错误识别码:"+errorMark);

log.error("【{}】系统错误:AJAX请求异常",errorMark);

response.setStatus(500);

response.setCharacterEncoding("UTF-8");

response.setContentType("application/json;charset=utf-8");

try(PrintWriterout=response.getWriter()){

out.append(json.toString());

}catch(IOExceptione){

e.printStackTrace();

}

returnnull;

}else{

//页面请求

ModelAndViewmv=newModelAndView();

mv.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);

mv.addObject("errorMark",errorMark);

mv.setViewName("common/500");

log.error("【{}】系统错误:HTML请求异常",errorMark,error);

returnmv;

}

}

}

在类上加上@ControllerAdvice和@Slf4j注解,前者是springBoot提供的注解,后者是lombok提供的日志注解,可以省却繁琐的日志声明,推荐使用,可自行百度了解其功能。

@ExceptionHandler用于标记一个方法为异常处理方法,value值是需要捕获的具体异常,这里我们捕获了所有异常,该方法可以传入3个参数,分别为请求,响应及异常。对于一个请求来说,一般可能为异步或者直接页面视图请求,我们可以根据请求头判断其详细的请求类型,并做对应的处理。

新建一个随机标记,便于我们快速定位错误,这里我们使用了uuid,以最大程度避免重复。然后我们就可以根据请求的不同做不同的处理了。无论是页面请求还是异步请求,我们的思路是一致的,即返回错误信息并添加错误标记,错误标记会存在于日志之中,使用错误标记进行搜索便可以快速定位错误位置。

对于视图请求,我们建立一个视图模板(模板引擎使用thymeleaf):

500

500内部服务器错误InternalServerError


错误识别码:,请复制该识别码,并提交给站长以排除错误,谢谢!
返回首页>>>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Path注解是JAX-RS规范中的注解,而Spring Boot是基于Spring框架的Web应用程序框架,两者并不是直接相关的。在Spring Boot中,通常使用@ControllerAdvice注解来定义全局异常处理器,它可以捕获所有Controller中抛出的异常,并根据异常类型或其他条件进行处理。 如果您的应用程序同时使用JAX-RS和Spring Boot,您可以使用Spring Boot的@ControllerAdvice注解来定义全局异常处理器,但是您需要使用JAX-RS的ExceptionMapper将JAX-RS的异常映射到Spring Boot的异常处理器中。 例如,您可以创建一个类并使用@Provider注解将它标记为JAX-RS提供程序,并实现ExceptionMapper接口,将JAX-RS的异常映射到Spring Boot的异常处理器中,如下所示: ``` @Provider public class MyExceptionMapper implements ExceptionMapper<Exception> { @Override public Response toResponse(Exception exception) { // 将JAX-RS的异常映射到Spring Boot的异常处理器中 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal server error").build(); } } ``` 然后,您可以使用@ControllerAdvice注解来定义Spring Boot的全局异常处理器,并处理所有异常,例如: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 需要注意的是,JAX-RS和Spring Boot的异常处理器是两个不同的机制,需要通过ExceptionMapper将它们连接起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值