异常处理:

背景:

最近在搭建属于自己的个人博客(码农小白的执念),自己搭建后端的时候首先考虑的是异常处理。个人也是一边学习一边做,难免有疏漏的地方,希望朋友们在不对的地方提醒下。

技术栈:

  1. springBoot 2.5.3
  2. Mybatis-plus
  3. thymeleaf
  4. mysql

该博客简单记录一下自己的学习过程,如果后面作出简单的demo来,那么会整理其中的细节发布出来。

异常处理

个人粗糙的学习和理解,我把异常错误分为三个,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;
}

结束:

如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。

SpringBoot博客开发之异常处理的更多相关文章

  1. Padrino 博客开发示例

    英文版出处:http://www.padrinorb.com/guides/blog-tutorial 楼主按 拿作者自己的话说:Padrino(谐音:派骓诺)是一款基于Sinatra的优雅的Web应 ...

  2. Django博客开发实践,初学者开发经验

    python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...

  3. Django个人博客开发 | 前言

    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...

  4. Django 博客开发教程目录索引

    Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...

  5. django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务

    上一篇博客介绍了comments库使用及ajax支持,现在blog已经具备了基本的功能,但是只能发表文字,不支持富文本编辑.今天我们利用markdown添加富文本支持. markdown语法说明: h ...

  6. django 简易博客开发 4 comments库使用及ajax支持

    首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog 上一篇文章我们介绍了静态文件使用以及如何使用from实现对blog的增删改,这篇将介绍如何给 ...

  7. django 简易博客开发 3 静态文件、from 应用与自定义

    首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...

  8. django 简易博客开发 2 模板和数据查询

    首先还是贴一下项目地址  https://github.com/goodspeedcheng/sblog   因为代码全在上面 上一篇博客我们介绍了 django的安装配置,新建project,新建a ...

  9. django 简易博客开发 1 安装、创建、配置、admin使用

    首先贴一下项目地址吧  https://github.com/goodspeedcheng/sblog 到现在位置项目实现的功能有: 1.后台管理使用Admin ,前端显示使用bootstrap 2. ...

随机推荐

  1. 5分钟搞定一个网页特效----v客学院技术分享

    这是我们v客学院基础班的童鞋都做完的一个超简单炫酷的特效demo,今天我来带大家用最快的速度和最简单的方法制作一个音乐抖动条,大家有兴趣不妨一起来试试~~~~~~~ 做这个demo之前我们得有一些ht ...

  2. 【洛谷P1281 书的复制】二分+动态规划

    分析 两个做法,一个DP,一个是二分. 二分:也就是二分枚举每个人分到的东西. DP:区间DP F[I][J]表示前i本书分给j个人用的最短时间 由于每一次j的状态由比j小的状态得出,所以要先枚举j, ...

  3. 我去!爬虫遇到JS逆向AES加密反爬,哭了

    今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...

  4. jvm源码解读--12 invokspecial指令的解读

    先看代码 package com.zyt.jvmbook; public class Girl extends Person{ public Girl() { int a; } @Override p ...

  5. react踩坑笔记

    1.create-react-app中配置webpack // 方法一:将项目的配置文件抽取到项目中,即运行: npm run eject // 方法二:使用react-app-rewired 2.c ...

  6. solr(CVE-2019-0193)远程命令执行

    影响版本 Apache Solr < 8.2.0 并且开启了DataImportHandler模块(默认情况下该模块不被启用) 安装 重启daoker  更新配置文件 systemctl dae ...

  7. 大数据学习(26)—— Spark之RDD

    做大数据一定要有一个概念,需要处理的数据量非常大,少则几十T,多则上百P,全部放内存是不可能的,会OOM,必须要用迭代器一条一条处理. RDD叫做弹性分布式数据集,是早期Spark最核心的概念,是一种 ...

  8. 从 HTTP 切换到 HTTPS,这下我的技术博客安全了吧?

    博客园 的小伙伴们,大家好,我是刚脱离险境的二哥呀! 很久(大概两年)之前,我就搞了一个独立的个人博客网站,长下面这样. 大家有访问过的,可以在评论区扣 1 可惜一直没搞备案和 HTTPS,导致每次访 ...

  9. 网络安全日记 ① IIS 之web服务器搭建以及dns转发配置

    IIS(internet info server)服务器的搭建 创建iis服务 打开光驱 选择网络应用服务 安装iis和ftp(后面有讲) 配置服务 通过管理工具打开iis 2. 此时80端口就已经开 ...

  10. 进入mysql的学习>从零开始学JAVA系列

    目录 MySQL的学习 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) MYSQL基本指令 DDL ...