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

Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

目录

一、单个控制器异常处理

1.1 控制器方法

1.2 编写出错页面

1.3 测试结果

二、全局异常处理

2.1 一个有异常的控制器类

2.2 全局异常处理器类

2.3 测试结果 

三、自定义异常处理器

3.1 自定义异常处理器

3.2 测试结果

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章   


一、单个控制器异常处理

在系统当中, Dao、Service、Controller层代码出现都可能抛出异常。如果哪里产生异常就在哪里处理,则会降低开发效率。所以一般情况下我们会让异常向上抛出,最终到达DispatcherServlet中,此时SpringMVC提供了异常处理器进行异常处理,这样可以提高开发效率

处理单个Controller的异常:

1.1 控制器方法

package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class MyController {// 处理单个Controller异常@RequestMapping("/t1")public String t1(){String str = null;// str.length();// int flag = 1/0;int []arr = new int[1];arr[2] = 10;return "index";}/*** 异常处理方法* @param ex 异常对象* @param model 模型对象* @return*/// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandler1(Exception ex, Model model){// 向模型中添加异常对象model.addAttribute("msg",ex);// 跳转到异常页面return "error";}// 方法一不能处理的异常交给方法二处理@ExceptionHandler({java.lang.Exception.class})public String exceptionHandler2(Exception ex,Model model){model.addAttribute("msg",ex);return "error2";}
}

从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。

1.2 编写出错页面

这里编写两个错误页面,为了是测试控制器是否成功知道出现的是哪一个错误。

错误页面1

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>出错了!</title>
</head>
<body>
<h3>ERROR 发生异常! ${msg}</h3>
</body>
</html>

严重错误页面2

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>出错了!</title>
</head>
<body>
<h3>ERROR2 发生严重异常! ${msg}</h3>
</body>
</html>

1.3 测试结果

OK,这里测试运行一下,上面的应该返回的是错误页面2,因为出现的错误是数组越界访问。

OK,我们再换一个错误,注释掉以下几行,再重新运行一遍是否跳到错误页面1,因为这里出现的算术错误。

OK,可以看到这里确实返回错误页面1出来了

二、全局异常处理

在控制器中定义异常处理方法只能处理该控制器类的异常,要想处理所有控制器的异常,需要定义全局异常处理类。如何体现这个全局异常处理呢,我们需要新建一个异常类,一个全局异常处理类,错误页面就按照上面两个即可。

2.1 一个有异常的控制器类

这里就用一个数组越界的错误类。

package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;// 编写另一个有异常的控制器类
@Controller
public class MyController2 {@RequestMapping("/t2")public String t1(){String str = null;// str.length();// int flag = 1/0;int []arr = new int[1];arr[2] = 10;return "index";}
}

2.2 全局异常处理器类

从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。

package com.example.controller;import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;// 全局异常处理类:添加@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {/*** 异常处理方法* @param ex 异常对象* @param model 模型对象* @return*/// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandler1(Exception ex, Model model){// 向模型中添加异常对象model.addAttribute("msg",ex);// 跳转到异常页面return "error";}// 方法一不能处理的异常交给方法二处理@ExceptionHandler({java.lang.Exception.class})public String exceptionHandler2(Exception ex,Model model){model.addAttribute("msg",ex);return "error2";}
}

2.3 测试结果 

OK,访问路径:http://localhost:8080/t2

OK,确实和我们预料的一样,全局异常处理类发挥了作用。

三、自定义异常处理器

以上方式都是使用的SpringMVC自带的异常处理器进行异常处理,我们还可以自定义异常处理器处理异常:

3.1 自定义异常处理器

package com.example.controller;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;// 自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView modelAndView = new ModelAndView();if(e instanceof NullPointerException){modelAndView.setViewName("error");}else {modelAndView.setViewName("error2");System.out.println("我自己的异常处理器");}modelAndView.addObject("msg",e);return modelAndView;}
}

3.2 测试结果

OK,为了体现自定义的异常处理器,我把全局异常处理器删除再重新启动服务器,访问上面那个有异常控制类。可以看到自定义异常处理类发挥了作用。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章   

SpringMVC系列专栏Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇

Spring MVC相关注解运用 —— 中篇

Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】
http://www.lryc.cn/news/95315.html

相关文章:

  • 使用3ds Max粒子系统创建飞天箭雨特效场景
  • 【朴素贝叶斯实例】
  • MPAS跨尺度、可变分辨率模式
  • 微信小程序对接SSE接口记录
  • Ngrok 的绝佳替代品,内网穿透神器 Serveo
  • 网络知识点之-路由
  • input 框如何移动光标,设置光标位置?
  • linux内核系统调用学习5:SYSCALL_DEFINE<0-6>
  • maven镜像仓库配置(多镜像自动切换)
  • ChatGPT在智能监控和安防系统中的应用如何?
  • 【Spring Boot Admin】介绍以及使用
  • 本地私有仓库部署、docker--harbor私有仓库部署和管理
  • java根据模板导出word
  • spring学习笔记十四
  • 【springmvc部分功能源码仿写第一步】实现java对目录下所有文件的遍历
  • SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交
  • 论文解读|用于从RGB-D数据进行3D物体检测的Frustum PointNets
  • 3ds Max图文教程: 使用动态工具Mass FX 创建风铃动画
  • 抖音矩阵系统源码开发搭建部署分享
  • Grafana图形web监控的安装与配置
  • 【机器学习】了解 AUC - ROC 曲线
  • Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析
  • C++STL库中的vector
  • PHP 药店管理系统mysql数据库web结构apache计算机软件工程网页wamp
  • 【多选框、表格全选】element el-checkbox、el-table
  • 【Java】微服务负载均衡算法实现
  • 分类、回归常用损失函数
  • SaaS到底是什么,如何做?这份笔记讲明白了
  • Python 单继承、多继承、@property、异常、文件操作、线程与进程、进程间通信、TCP框架 7.24
  • 【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书