SpringBoot博客开发项目中的全局异常处理

异常处理

个人粗糙的学习和理解,我把异常错误分为三个,4xx,5xx,error(自定义)

常用的是404和500响应

  • 404 (未找到) 服务器找不到请求的网页
  • 服务器内部错误 服务器遇到错误,无法完成请求

在templates文件下创建404.html、500.html和error.html

如果创建的是4xx.html和5xx.html,那么当页面找不到或者程序内部错误的话,SpringBoot自动匹配到这两个页面,具体的源码在这里就不分析,感兴趣的可以去学习下。

当我想将错误信息返回到我自定义的页面怎么写?

我们自顶向下来思考:

1.我们访问页面的时候,页面发生错误也好,找不到也好,是不是都要走它请求的Url,那我们怎么处理这个请求呢?
2.这时候我们自然而然的想到拦截器,所以编写ControllerExceptionHandler类,来专门拦截所有的异常请求。
3.当我们处理完异常后,把这个流放行,或者返回我们需要的自定义页面上。

这样就实现了我们上述的需求。

所需要的技术点:

1.@ControllerAdvice

  • 配合 @ExceptionHandler注解结合使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等.

2.@ExceptionHandler(Exception.class) // 表示 捕获 全部异常
3.ModelAndView 其实就是两个作用,一个是指定返回页面,另一个是在返回页面的同时添加属性

通过Logger来打印获取相关的异常信息:

//获取异常的信息
logger.error(() -> {
    return String.format("Request URL : %s,Exception : %s ", request.getRequestURL(),e);
},e);

在这里自己走了一些弯路,小伙子自己走窄了,导包倒错了😂。这里我导的包是mybatis中的:

import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;

传参一直不对,只能走源码的路子了,看看自己调用的什么玩意:最后就写成了上述的代码格式。

我看其他人写的代码的时候才恍然大明白,如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);

可能有的朋友感觉没啥,但是我自己调了半个小时才出来,菜是原罪。

Logger这个只是在控制台输出,或者绑定了日志,会输出到日志中。

接着上述问题通过ModelAndView类实现:

ModelAndView像极了Model。

ModelAndView modelAndView = new ModelAndView();  //实例化一个ModelAndView
modelAndView.addObject("url",request.getRequestURL());  //获取的url添加到model中
modelAndView.addObject("exception",e);  //获取的异常信息
//返回给error页面
modelAndView.setViewName("error/error");
return modelAndView;

敲黑板:来新需求了!

如果我想从所有的异常中剥离出404异常并返回给SpringBoot让他自动处理页面怎么解。

按照学习的来说。当页面为null的时候,向上抛出一个自定义的异常类,该异常类标注了异常状态。

throw new NotFoundException("博客找不到,请联系管理员"); //自定义类
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
    public NotFoundException() {
        super();
    }
    public NotFoundException(String message) {
        super(message);
    }
}

然后我们可以在总的异常中通过AnnotationUtils.findAnnotation通过传入AnnotatedElement注解类型来查找方法或者类对象上的注解。

如果满足条件可以抛出异常让SpringBoot接管。

if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
    throw e;
}

结束

如果本文对你有所帮助,欢迎点赞转发,也欢迎大家说说自己在学习的时候自己的一些心得,方便大家一起学习共同成长!关注“Java架构大仙”阅读更多技术干货文章。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容