异常常见位置与诱因
项目异常分类及处理方案
项目异常分类 | 场景 | 处理步骤 |
---|---|---|
业务异常(BusinessException) | 1.规范的用户行为产生的异常;2.不规范的用户行为操作产生的异常 | 发送对应消息传递给用户,提醒规范操作 |
系统异常(SystemException) | 项目运行过程中可预计且无法避免的异常 | 1.发送固定消息传递给用户,安抚用户;2.发送特定消息给运维人员,提醒维护;3.记录日志 |
其他异常(Exception) | 编程人员未预期到的异常 | 1.发送固定消息传递给用户,安抚用户;2.发送特定消息给编程人员,提醒维护(纳入预期范围内)3.记录日志 |
系统异常分类
系统异常(SystemException)分类 | 解决方式 |
---|---|
预期异常 | 通过捕获异常获取异常信息 |
运行时异常RuntimeException |
通过规范代码开发、测试等手段减少运行时异常发生 |
异常处理思路
在ssm框架中,异常向上抛出,持久层抛给业务层,业务层抛给Controller,Controller继续向上抛出给SpringMVC的核心前端控制器,最后由SpringMVC的核心前端控制器交由异常处理器进行异常处理
<img alt="image-20241127192154836">
方式一简单异常处理:使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
方式二自定义异常处理:实现Spring的异常处理接口HandlerExceptionResolver
自定义自己的异常处理器
后续示例的环境准备如下
导入坐标(略,可详见快速入门)
右键源代码配置文件目录(即资源文件resources
)→New
→XML Configuration File
→Spring Config
,创建Spring和SpringMVC的核心配置文件,代码截图如下
<img alt="image-20241127195143030">
创建业务层service包、controller包、异常exception包,代码截图如下
<img alt="image-20241127201946467">
配置web项目核心目录(即webapp
)下的WEB-INF
中的web.xml,并在webapp目录下创建jsp文件夹,并写入4个页面success.jsp、error.jsp、errorshow1.jsp、errorshow5.jsp,代码截图如下
show1()
、show2()
方法抛出异常后所映射的视图<img alt="image-20241127203847996">
此时运行后前端页面会报对应异常,分别如下图所示
<img alt="image-20241127202651332">
<img alt="image-20241127202744763">
<img alt="image-20241127202825634">
<img alt="image-20241127202857382">
<img alt="image-20241127202933094">
初始项目结构如下
<img alt="image-20241127204148844">
注意:SpringMVC已经定义好了该类型的转换器,在使用时可根据项目情况在SpringMVC的核心配置文件中进行相应 异常与视图 的映射配置
简单异常处理只需要在SpringMVC核心配置文件中配置异常处理机制即可,代码如下
<!--配置异常处理机制-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error1"/>
<property name="exceptionMappings">
<map>
<entry key="at.guigu.exception.MyException" value="error2"/>
<entry key="java.lang.ClassCastException" value="error3"/>
</map>
</property>
</bean>
==原理:== 通过SpringMVC提供的简单异常处理器
SimpleMappingExceptionResolver
配置异常处理机制。当某个异常抛出时,Spring会根据配置的exceptionMappings
映射到异常所对应的视图。如果抛出的异常没有在exceptionMappings
中配置,那么会使用defaultErrorView
指定的默认错误视图。
==示例代码解释:== 当抛出的异常为MyException时则会映射到视图error2.jsp;当抛出异常为ClassCastException时则会映射到视图error3.jsp;若抛出的异常没有在
exceptionMappings
中配置,则此时按照defaultErrorView(即默认异常视图)映射到error1.jsp
==注意:== 在配置异常处理机制的代码中,视图均为带后缀名
.jsp
,是因为已在SpringMVC的核心配置文件中提前配置了内部资源视图解析器
代码运行示例
未在SpringMVC核心配置文件中配置异常处理机制时,此时由于有异常所以前端会显示异常页面,可详见环境准备中的运行截图
在SpringMVC核心配置文件中配置异常处理机制,完整代码如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--mvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置Controller层的注解的组件扫描-->
<context:component-scan base-package="at.guigu.controller"></context:component-scan>
<!--等同于
<context:component-scan base-package="at.guigu">
type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
只扫描at.guigu包下有@Controller注解的类
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
-->
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--将InternalResourceViewResolver类中的视图名称前缀属性prefix的值设为/jsp/-->
<property name="prefix" value="/jsp/"></property>
<!--将InternalResourceViewResolver类中的视图名称后缀属性suffix的值设为.jsp-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置静态资源的路径映射,让 Spring MVC 可以处理静态文件-->
<mvc:default-servlet-handler/>
<!--配置异常处理机制-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"/>
<property name="exceptionMappings">
<map>
<entry key="java.lang.ClassCastException" value="errorShow1"/>
<entry key="at.guigu.exception.MyException" value="errorshow5"/>
</map>
</property>
</bean>
</beans>
运行截图如下
show1()
ClassCastException
异常自动映射到errorShow1.jsp页面
<img alt="image-20241127204445498">
show5()
自定义MyException
异常自动映射到errorShow5.jsp页面
<img alt="image-20241127204558231">
其它异常自动映射到error.jsp页面
<img alt="image-20241127204720478">
步骤
HandlerExceptionResolver
接口的异常处理器类代码实现
创建一个与三层架构包同级的resolver包,并在该包下创建一个实现HandlerExceptionResolver
接口的异常处理器类MyExceptionResolver
,并重写其中的resolveException
方法,代码如下
package at.guigu.resolver;
import at.guigu.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyExceptionResolver implements HandlerExceptionResolver {
/**
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e:为抛出的异常对象
* @return :返回ModelAndView对象,为异常映射的视图
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
// 若是ClassCastException异常则映射到errorShow1.jsp页面
if (e instanceof ClassCastException) {
modelAndView.setViewName("errorShow1");
// 若是自定义MyException异常则映射到errorShow5.jsp页面
} else if (e instanceof MyException) {
modelAndView.setViewName("errorShow5");
// 若是其它异常则映射到error.jsp页面
} else {
modelAndView.setViewName("error");
}
return modelAndView;
}
}
在SpingMVC的核心配置文件中配置自定义异常处理机制,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--mvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置Controller层的注解的组件扫描-->
<context:component-scan base-package="at.guigu.controller"></context:component-scan>
<!--等同于
<context:component-scan base-package="at.guigu">
type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
只扫描at.guigu包下有@Controller注解的类
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
-->
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--将InternalResourceViewResolver类中的视图名称前缀属性prefix的值设为/jsp/-->
<property name="prefix" value="/jsp/"></property>
<!--将InternalResourceViewResolver类中的视图名称后缀属性suffix的值设为.jsp-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置静态资源的路径映射,让 Spring MVC 可以处理静态文件-->
<mvc:default-servlet-handler/>
<!--
配置异常处理机制
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"/>
<property name="exceptionMappings">
<map>
<entry key="java.lang.ClassCastException" value="errorShow1"/>
<entry key="at.guigu.exception.MyException" value="errorShow5"/>
</map>
</property>
</bean>
-->
<!--配置自定义异常处理机制-->
<bean class="at.guigu.resolver.MyExceptionResolver"/>
</beans>
编写异常映射页面。(本步骤已在环境准备工作中实现,此处省略)
运行截图如下
show1()
ClassCastException
异常自动映射到errorShow1.jsp页面
<img alt="image-20241127204445498">
show5()
自定义MyException
异常自动映射到errorShow5.jsp页面
<img alt="image-20241127204558231">
其它异常自动映射到error.jsp页面
<img alt="image-20241127204720478">
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。