SpringBoot全局异常处理器的简单使用
创作时间:
作者:
@小白创作中心
SpringBoot全局异常处理器的简单使用
引用
CSDN
1.
https://blog.csdn.net/weixin_74004976/article/details/139390252
在Spring Boot开发中,全局异常处理器是一个非常重要的组件,它可以帮助我们统一处理应用程序中的所有未捕获异常,提供一致的错误信息给用户,同时方便开发者进行日志记录和错误统计。本文将详细介绍Spring Boot全局异常处理器的使用方法,并通过一个简单的演示案例帮助读者快速上手。
SpringBoot全局异常处理器
什么是全局异常处理器
- 全局异常处理器(Global Exception Handler)是一个在Java Web应用中处理所有未捕获异常的 handler。它可以帮助我们在发生异常时进行统一的错误处理和友好的提示,避免直接向用户展示技术细节。
- 在Spring Boot中,我们可以通过@ControllerAdvice和@ExceptionHandler注解来实现全局异常处理器
为什么要使用全局异常处理器
- 统一处理:全局异常处理器可以集中处理应用程序中所有未捕获的异常,这样可以避免在各个地方重复处理相同的异常逻辑,提高代码的整洁性和可维护性。
- 错误信息:通过全局处理器,可以提供一致的错误信息给用户,即使在发生复杂的错误时,也能给出清晰的错误提示,提升用户体验。
- 日志记录:全局处理器可以捕获所有异常,方便开发者在后台进行详细的日志记录,有助于问题排查和追踪。
- 错误统计:处理异常时,可以收集和统计不同类型的异常,用于性能监控和系统健康度检查。
- 异常转跳:全局处理器可以控制异常发生时的页面跳转,比如跳转到错误页面、重定向到登录页面等,根据应用需求进行定制。
- API友好:对于API服务,全局异常处理器可以处理HTTP异常,返回统一的HTTP状态码和错误信息,保持API的稳定性和一致性。
简单的演示案例
- 首先我们创建基础异常类
public class BaseException extends RuntimeException{
public BaseException() {
}
public BaseException(String message) {
super(message);
}
}
- 我们用自定义异常类(起名要见名知意)来继承基础异常类
public class UsernameNotNull extends BaseException{
public UsernameNotNull() {
}
public UsernameNotNull(String message) {
super(message);
}
}
- 配置全局异常处理器
import com.example.exception.BaseException;
import com.example.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler
public Result exceptionHandler(BaseException ex){
log.info("异常信息:{}", ex.getMessage());
return Result.error(ex.getMessage());
}
}
测试
- Controller模拟实现
import com.example.dto.UserLoginDTO;
import com.example.exception.UsernameNotNull;
import com.example.properties.JwtProperties;
import com.example.result.Result;
import com.example.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private JwtProperties jwtProperties;
@PostMapping("/login")
public Result<String> login(@RequestBody UserLoginDTO userLoginDTO){
//这里不再书写业务层和数据库层,而是进行模拟
String nameDB = "hyt";
String passwordDB = "123456";
String name = userLoginDTO.getName();
String password = userLoginDTO.getPassword();
//进行简单的全局异常模拟
if (name.isEmpty()){
throw new UsernameNotNull("名字不能为空(自定义)");
}
if(name.equals(nameDB) && password.equals(passwordDB)){
Map<String, Object> claims = new HashMap<>();
//这里id我随机生成,在真实业务时是通过数据过查询得到的
Random random = new Random();
claims.put("userId", random.nextInt(100));
String token = JwtUtil.createJwt(
claims, jwtProperties.getAdminTtl(),
jwtProperties.getSecretKey());
//按照前后联调一致格式返回
return Result.success(token);
}
return Result.error("密码错误");
}
}
正常情况下
当我们用户名为空,可以看到确实对异常进行了处理
热门推荐
东山岛冬季旅游:气温宜人游客少,4大景点详解
漳州秋季精选两日游:海岛度假配土楼文化体验
东山岛日出攻略:从金銮湾到南门湾,三大观景点全解析
鹦鹉脚受伤怎么办?科学护理与专业治疗指南
麦哲伦环球航行:首次验证地球是球体的伟大航程
毕业季祝福语大集合,让你的祝福与众不同
宝可梦朱紫铁包袱怎么配招?铁包袱配招攻略来了!
黑芝麻核桃大作战:告别白发不是梦!
古代女子也能入仕!女官制度如何发展?又负责哪些工作呢?
飞行模式,让休闲时光更纯粹
CNN模型优化实战:从数据预处理到超参数调优
大数据时代CNN:MINIS数据集的新突破
从收益到风险:理财产品评估关键指标解析
基金定投:无需择时的懒人理财法,四种人群都适用
江苏百岁老人饮食调查:粗粮豆制品助长寿
49年未生病,99岁医生的7种食物养生法
铁路警察学习人民警察法:加强执法能力与法律素养
太燃了!《警察特训计划》来啦!
宁园:一座承载天津城市记忆的百年园林
胡华:用“深刻、诗意、温柔、真诚”的心做极致的儿童教育
低GI食物真的能控糖吗?燕麦、红豆、苹果告诉你真相
糖尿病患者必备:血糖监测小窍门
科学应对肝硬化瘙痒:四大方案助力患者缓解症状
专家解析:肝硬化皮肤瘙痒的科学应对方案
解码梦境:古埃及梦境神殿与现代心理学的两种探索
飞行、坠落、考试:梦境符号背后的潜意识密码
A股交易时间延长:全球趋势下的机遇与挑战
上交所延长指定交易申报时间:提升效率,服务投资者
蓬莱古船博物馆:四艘古船揭示东方海上丝路奥秘
国家海洋博物馆推出《遇见蓝眼泪》展:数字科技呈现神秘海洋世界,呼吁保护海洋环境