当前位置: 首页 > news >正文

SpringBoot项目中的异常处理

定义错误页面

SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息

如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 在src/main/resources/templates 目录下创建 error.html 页面。注意:名称必须叫 error
 

 @ExceptionHandler 处理

针对特定的异常做出不同的处理,我们可以通过@ExceptionHandle来处理实现,具体如下

@Controller
public class UserController {/*** 模拟 NullPointerException* @return*/@RequestMapping("/show1")public String showInfo(){String str = null;str.length();return "index";}/*** 模拟 ArithmeticException* @return*/@RequestMapping("/show2")public String showInfo2(){int a = 10/0;return "index";}/*** java.lang.ArithmeticException* 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定* 参数 Exception e:会将产生异常对象注入到方法中*/@ExceptionHandler(value={java.lang.ArithmeticException.class})public ModelAndView arithmeticExceptionHandler(Exception e){ModelAndView mv = new ModelAndView();mv.addObject("error", e.toString());mv.setViewName("error1");return mv;}/*** java.lang.NullPointerException* 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定* 参数 Exception e:会将产生异常对象注入到方法中*/@ExceptionHandler(value={java.lang.NullPointerException.class})public ModelAndView nullPointerExceptionHandler(Exception e){ModelAndView mv = new ModelAndView();mv.addObject("error", e.toString());mv.setViewName("error2");return mv;}
}

 错误页面

<!DOCTYPE html>
<html lang="en" >
<head><meta charset="UTF-8"><title>错误页面</title>
</head>
<body>
出错了,请与管理员联系。。。错误提示页面-ArithmeticException<br>
<span th:text="${error}"></span>
</body>
</html>
<!DOCTYPE html>
<html lang="en" >
<head><meta charset="UTF-8"><title>错误页面</title>
</head>
<body>
出错了,请与管理员联系。。。错误提示页面-NullPointerException <br>
<span th:text="${error}"></span>
</body>
</html>

 

 @ControllerAdvice+@ExceptionHandler处理

第二种处理方式中,异常处理的代码和业务代码放在一个类中了,这种方式耦合性太强了,最好是将业务和异常处理的代码分离开,这时我们可以定义一个专门的异常处理类,通过注解@ControllerAdvice来实现。具体如下:

@ControllerAdvice
public class GlobalException {/*** java.lang.ArithmeticException* 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定* 参数 Exception e:会将产生异常对象注入到方法中*/@ExceptionHandler(value={java.lang.ArithmeticException.class})public ModelAndView arithmeticExceptionHandler(Exception e){ModelAndView mv = new ModelAndView();mv.addObject("error", e.toString()+" -- advice");mv.setViewName("error1");return mv;}/*** java.lang.NullPointerException* 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定* 参数 Exception e:会将产生异常对象注入到方法中*/@ExceptionHandler(value={java.lang.NullPointerException.class})public ModelAndView nullPointerExceptionHandler(Exception e){ModelAndView mv = new ModelAndView();mv.addObject("error", e.toString()+" -- advice");mv.setViewName("error2");return mv;}
}

控制器中实现

@Controller
public class UserController {/*** 模拟 NullPointerException* @return*/@RequestMapping("/show1")public String showInfo(){String str = null;str.length();return "index";}/*** 模拟 ArithmeticException* @return*/@RequestMapping("/show2")public String showInfo2(){int a = 10/0;return "index";}
}

SimpleMappingExceptionResolver处理 

我们还可以通过SimpleMappingExceptionResolver将具体的异常和错误页面指定对应关系,这样就不用每个异常都单独写一个方法了。

@Configuration
public class GlobalException {/*** 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver*/@Beanpublic SimpleMappingExceptionResolvergetSimpleMappingExceptionResolver(){SimpleMappingExceptionResolver resolver = newSimpleMappingExceptionResolver();Properties mappings = new Properties();/*** 参数一:异常的类型,注意必须是异常类型的全名* 参数二:视图名称*/mappings.put("java.lang.ArithmeticException", "error1");mappings.put("java.lang.NullPointerException","error2");//设置异常与视图映射信息的resolver.setExceptionMappings(mappings);return resolver;}
}

自定义HandlerExceptionResolver处理

最后我们还可以通过实现HandlerExceptionResolver 接口来根据不同异常类型来动态处理异常。

@Configuration
public class GlobalException implements HandlerExceptionResolver {/*** @param httpServletRequest* @param httpServletResponse* @param o* @param e* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) {ModelAndView mv = new ModelAndView();//判断不同异常类型,做不同视图跳转if (ex instanceof ArithmeticException) {mv.setViewName("error1");}if (ex instanceof NullPointerException) {mv.setViewName("error2");}mv.addObject("error", ex.toString());return mv;}
}

http://www.lryc.cn/news/524965.html

相关文章:

  • ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)尚待完善
  • NLTK命名实体识别(NER)
  • 【游戏设计原理】78 - 持续注意力
  • Android设备:Linux远程lldb调试
  • 多层 RNN原理以及实现
  • [Computer Vision]实验三:图像拼接
  • 【Vim Masterclass 笔记22】S09L40 + L41:同步练习11:Vim 的配置与 vimrc 文件的相关操作(含点评课内容)
  • 5.9 洞察 OpenAI - Translator:日志(Logger)模块的 “时光记录仪”
  • 客户案例:电商平台对帐-账单管理(亚马逊amazon)
  • IP协议特性
  • Kubernetes入门学习
  • 支持向量机SVM的应用案例
  • Chrome 132 版本新特性
  • (5)STM32 USB设备开发-USB键盘
  • Linux 系统服务开机自启动指导手册
  • 分布式多卡训练(DDP)踩坑
  • Codeforces Round 1000 (Div. 2)-C题(树上两个节点不同边数最大值)
  • C++17 新特性解析:Lambda 捕获 this
  • Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
  • Spring Boot 事件驱动:构建灵活可扩展的应用
  • IM系统设计
  • 华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包
  • ASP.NET Blazor托管模型有哪些?
  • PyTorch广告点击率预测(CTR)利用深度学习提升广告效果
  • PAT甲级-1017 Queueing at Bank
  • OneData体系架构详解
  • Gin 框架入门实战系列教程
  • 鸿蒙harmony json转对象(2)
  • M-LAG与E-trunk
  • 【面试常见问题】