欢迎来到阿八个人博客网站。本
阿八个人博客
网站提供最新的站长新闻,各种互联网资讯。
喜欢本站的朋友可以收藏本站,或者加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