SpringBoot博客开发之异常处理
异常处理:
背景:
最近在搭建属于自己的个人博客(码农小白的执念),自己搭建后端的时候首先考虑的是异常处理。个人也是一边学习一边做,难免有疏漏的地方,希望朋友们在不对的地方提醒下。
技术栈:
- springBoot 2.5.3
- Mybatis-plus
- thymeleaf
- mysql
该博客简单记录一下自己的学习过程,如果后面作出简单的demo来,那么会整理其中的细节发布出来。
异常处理
个人粗糙的学习和理解,我把异常错误分为三个,4xx,5xx,error(自定义)
常用的是404和500响应
- 404 (未找到) 服务器找不到请求的网页
- 服务器内部错误 服务器遇到错误,无法完成请求
在templates文件下创建404.html、500.html和error.html
如果创建的是4xx.html和5xx.html,那么当页面找不到或者程序内部错误的话,SpringBoot自动匹配到这两个页面,具体的源码在这里就不分析,感兴趣的可以去学习下。
当我想将错误信息返回到我自定义的页面怎么写?
我们自顶向下来思考:
- 我们访问页面的时候,页面发生错误也好,找不到也好,是不是都要走它请求的Url,那我们怎么处理这个请求呢?
- 这时候我们自然而然的想到拦截器,所以编写ControllerExceptionHandler类,来专门拦截所有的异常请求。
- 当我们处理完异常后,把这个流放行,或者返回我们需要的自定义页面上。
这样就实现了我们上述的需求。
所需要的技术点:
- @ControllerAdvice
- 配合 @ExceptionHandler注解结合使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等.
- @ExceptionHandler(Exception.class) // 表示 捕获 全部异常
- 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;
}
结束:
如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;
有错误的地方,欢迎在评论指出,作者看到会进行修改。
SpringBoot博客开发之异常处理的更多相关文章
- Padrino 博客开发示例
英文版出处:http://www.padrinorb.com/guides/blog-tutorial 楼主按 拿作者自己的话说:Padrino(谐音:派骓诺)是一款基于Sinatra的优雅的Web应 ...
- Django博客开发实践,初学者开发经验
python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...
- Django个人博客开发 | 前言
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...
- Django 博客开发教程目录索引
Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...
- django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务
上一篇博客介绍了comments库使用及ajax支持,现在blog已经具备了基本的功能,但是只能发表文字,不支持富文本编辑.今天我们利用markdown添加富文本支持. markdown语法说明: h ...
- django 简易博客开发 4 comments库使用及ajax支持
首先还是贴一下源代码地址 https://github.com/goodspeedcheng/sblog 上一篇文章我们介绍了静态文件使用以及如何使用from实现对blog的增删改,这篇将介绍如何给 ...
- django 简易博客开发 3 静态文件、from 应用与自定义
首先还是贴一下源代码地址 https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...
- django 简易博客开发 2 模板和数据查询
首先还是贴一下项目地址 https://github.com/goodspeedcheng/sblog 因为代码全在上面 上一篇博客我们介绍了 django的安装配置,新建project,新建a ...
- django 简易博客开发 1 安装、创建、配置、admin使用
首先贴一下项目地址吧 https://github.com/goodspeedcheng/sblog 到现在位置项目实现的功能有: 1.后台管理使用Admin ,前端显示使用bootstrap 2. ...
随机推荐
- [NOIp2012]疫情控制 题解
好久没更,强迫自己写一篇. 神 tm 大预言家出的题 注意到如果 \(x\) 小时可以控制住疫情,则 \(\forall x'>x\) 必然也可以控制住疫情,显然答案具有单调性,可以二分答案. ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】
一.互斥锁基本概念: 1.互斥锁又称互斥型信号量,是一种特殊的二值性信号量[二值型信号量可以理解为任务与中断间或者两个任务间的标志,该标志非"满"即"空"],用 ...
- 爬取房价信息并制作成柱状图XPath,pyecharts
以长沙楼盘为例,看一下它的房价情况如何url = https://cs.newhouse.fang.com/house/s/b91/ 一.页面 二.分析页面源代码 我们要获得的数据就是名字和价格,先来 ...
- 组合数取模(lukas)板子
求 C(n,m)%mo #include<bits/stdc++.h>#define re register int#define mo 10007#define ll long long ...
- JavaEE精英进阶课学习笔记《博学谷》
JavaEE精英进阶课学习笔记<博学谷> 第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准 ...
- 内置函数 strlen
1 //内置函数 strlen 2 //计算字符串的实际长度,不含字符串结束标准\0 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 ...
- Windows协议 NTLM篇
NTLM 基础 介绍 LM Hash & NTLM Hash Windows本身是不会存储明文密码的,只保存密码的hash 其中本机用户的密码hash是放在本地的SAM文件里面,域内用户的密码 ...
- 这个 Redis 连接池的新监控方式针不戳~我再加一点佐料
Lettuce 是一个 Redis 连接池,和 Jedis 不一样的是,Lettuce 是主要基于 Netty 以及 ProjectReactor 实现的异步连接池.由于基于 ProjectReact ...
- 用于在公网环境下测试的Telnet/SSH服务器
google: public telnet server list for example: telnet nethack.alt.org ssh nethack@alt.org
- Rip CD on Ubuntu
用Mint自带的banshee可以把CD转换为ogg文件,[Media -> Import Media],然后选择Audio CD,但只能转换为ogg格式,好像不能自动获取ID3标签:比较好的方 ...