前言

先谈谈“异常处理”这件事。下面有 2 份伪代码,对比下:
// ① 基于 if/else 判断
if(deletePage(page) == E_OK){
if(registry.deleteReference(page.name) == E_OK){
if(configKeys.deleteKey(page.name.makeKey()) == E_OK){
logger.log("page deleted");
}else{
logger.log("configKey not deleted");
}
}else{
logger.log("deleteReference from registry failed");
}
}else{
logger.log("delete failed");
return E_RROR;
}
// ② 基于异常处理
try{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
logError(e);
}
可以看出,如果使用异常替代返回错误码,错误处理代码就能从主路径逻辑中分离出来,得到简化!
②中,基于异常处理的代码真的好吗?其实是丑陋不堪的,它搞乱了代码结构,把错误处理与正常流程混为一谈。最好把 try 和 catch 代码块的主体部分抽离出来,形成另外的函数。
// ③ 优雅的异常处理逻辑
public void delete(Page page){
try{
deletePageAndAllReferences(page);
}catch(Exception e){
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throw Exception{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e){
logger.log(e.getMessage());
}
③中,函数各司其职,更易于理解和修改了。
总结:使用异常而不是错误码,优雅地使用异常!函数应该只做一件事,处理错误就是一件事。因此,处理错误的函数不该做其他事!
在 Spring Boot 中处理异常
1、默认的异常处理
例如 401,404,500,5XX 等异常,Spring Boot 默认会跳转到预配置的页面,此处以 thymeleaf 模板引擎为例:
+ resources + templates + error - 401.html - 404.html - 500.html
只需在 resources/templates/error/ 路径下添加对应的html文件即可。
2、局部异常处理
局部异常一般处理业务逻辑出现的异常情况,在 Controller 下使用 @ExceptionHandler 注解来处理异常。举个小例子:
先定义 ResponseBean 和 ExceptionEnum 两个对象,辅助完成优雅的代码。
/**
* 统一响应
* @author anoy
*/
public class ResponseBean<T> {
private int code;
private String message;
private T data;
public ResponseBean(){}
public ResponseBean(ExceptionEnum exceptionEnum){
this.code = exceptionEnum.getCode();
this.message = exceptionEnum.getMessage();
}
// 省略 setter/getter
}
/**
* 异常类型枚举
* @author anoy
*/
public enum ExceptionEnum {
GIRL_FRIEND_NOT_FOUND(100000, "girl friend not found");
private int code;
private String message;
ExceptionEnum(int code, String message){
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
今天七夕,写个 GirlFriendNotFoundException(很有同感,是不是?)
@Controller
public class UserController {
@RequestMapping("/friend/{id}")
public String friend(@PathVariable("id") Long id) throws GirlFriendNotFoundException {
if (id == 1L){
throw new GirlFriendNotFoundException();
}
return "friend";
}
@ExceptionHandler(GirlFriendNotFoundException.class)
@ResponseBody
public ResponseBean handleGirlFriendNotFound(GirlFriendNotFoundException exception){
loggerError(exception);
return new ResponseBean(ExceptionEnum.GIRL_FRIEND_NOT_FOUND);
}
private void logError(Exception e){
logger.error(e.getMessage());
}
}
3、全局异常处理
个人观点:全局异常应该处理系统故障级别的问题,像参数校验这种类型的异常,应该作为局部异常来处理,例如 Redis 连接断开,无法请求数据,这种异常就应该当做全局异常来处理,在异常处理的逻辑中,还应该添加通知到开发人员的功能,方便开发人员及时处理错误!
全局异常处理,使用 @ControllerAdvice 和 @ExceptionHandler 来配合。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RedisConnectionFailureException.class)
public void handlerRedisConnectionFailureException(RedisConnectionFailureException exception){
logError(exception);
noticeToDev();
}
private void logError(Exception e){
logger.error(e.getMessage());
}
private void noticeToDev(){
// 通知具体开发人员
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Spring
# Boot
# 异常处理
# Spring Boot统一异常处理详解
# SpringBoot初始教程之统一异常处理详解
# 详解Springboot自定义异常处理
# Spring Boot全局异常处理解析
# springboot全局异常处理详解
# SpringBoot如何优雅的处理全局异常
# Spring boot项目中异常拦截设计和处理详解
# Spring Boot详细打印启动时异常堆栈信息详析
# 开发人员
# 一件事
# 就能
# 各司其职
# 很有
# 只需
# 错误码
# 这件事
# 个人观点
# 为例
# 可以看出
# 只做
# 该做
# 大家多多
# 举个
# 跳转到
# 而不是
# java
# deletePage
# class
相关文章:
如何规划企业建站流程的关键步骤?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
移民网站制作流程,怎么看加拿大移民官网?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
开封网站制作公司,网络用语开封是什么意思?
设计网站制作公司有哪些,制作网页教程?
如何高效配置香港服务器实现快速建站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
浅析上传头像示例及其注意事项
如何通过西部建站助手安装IIS服务器?
如何高效配置IIS服务器搭建网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速启动建站代理加盟业务?
制作网站的软件免费下载,免费制作app哪个平台好?
建站之星24小时客服电话如何获取?
如何选择美橙互联多站合一建站方案?
音响网站制作视频教程,隆霸音响官方网站?
建站之星微信建站一键生成小程序+多端营销系统
如何选择高效响应式自助建站源码系统?
建站之星导航菜单设置与功能模块配置全攻略
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
长沙做网站要多少钱,长沙国安网络怎么样?
建站之星如何防范黑客攻击与数据泄露?
高端云建站费用究竟需要多少预算?
如何在七牛云存储上搭建网站并设置自定义域名?
如何快速重置建站主机并恢复默认配置?
如何用搬瓦工VPS快速搭建个人网站?
如何高效搭建专业期货交易平台网站?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
建站之星好吗?新手能否轻松上手建站?
如何通过VPS搭建网站快速盈利?
建站主机服务器选型指南与性能优化方案解析
如何在宝塔面板创建新站点?
如何在企业微信快速生成手机电脑官网?
为什么Go需要go mod文件_Go go mod文件作用说明
定制建站模板如何实现SEO优化与智能系统配置?18字教程
三星网站视频制作教程下载,三星w23网页如何全屏?
网站制作公司,橙子建站是合法的吗?
高端企业智能建站程序:SEO优化与响应式模板定制开发
广德云建站网站建设方案与建站流程优化指南
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何在VPS电脑上快速搭建网站?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
Java解压缩zip - 解压缩多个文件或文件夹实例
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。