SpringMVC异常处理
本文最后更新于:1 年前
在我们的应用系统运行的过程中,可能由于运行环境、用户操作、资源不足等各方面的原因导致系统出现异常(HTTP状态异常、Exception);如果系统出现了异常,这些异常将会通过浏览器呈现给用户,而这种异常的显示是没有必要,因此我们可以在服务器进行特定的处理——当系统出现异常之后,呈现给用户一个统一的、可读的的异常提示页面。
SpringMVC异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
系统的 Dao、Service、Controller 出现都通过 throws Exception 向上抛出,最后由 SpringMVC 前端控制器交由异常处理器进行异常处理,如下图:
SpringMVC异常处理的几种方式
- 使用 Spring MVC注解 @ExceptionHandler 自定义异常处理器
- 使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver
- 实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器
使用 @ExceptionHandler 自定义异常处理器
使用 @ControllerAdvice 注解声明全局异常处理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@ControllerAdvice
public class MyExceptionHandler {
//声明该方法是异常处理器
@ExceptionHandler(ClassCastException.class)
public String nullHandler(){
return "/err1.jsp";
}
@ExceptionHandler(MyException.class)
public String formatHandler(){
return "/err2.jsp";
}
}创建错误视图页面
1
2
3
4
5err1.jsp
<body>
<h1>类型转换异常</h1>
</body>1
2
3
4
5err2.jsp
<body>
<h1>自定义异常</h1>
</body>控制器产生异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class DemoServiceImpl implements DemoService {
@Override
public void show1() {
System.out.println("抛出类型转换异常....");
Object str = "zhangsan";
Integer num = (Integer)str;
}
@Override
public void show5() throws MyException {
System.out.println("自定义异常....");
throw new MyException();
}
}测试
简单异常处理器 SimpleMappingExceptionResolver
SpringMVC 已经定义好了该类型转换器,在使用时可以根据项目情况在 spring-servlet.xml 中进行相应异常与视图的映射配置。
默认错误视图 defaultErrorView
- 创建通用错误视图页面 error.jsp:
1 |
|
配置异常处理器 defaultErrorView
1
2
3
4<!--配置异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"/> //默认错误视图
</bean>控制器产生异常
1
2
3
4
5
6
7
8
9public class DemoServiceImpl implements DemoService {
@Override
public void show1() {
System.out.println("抛出类型转换异常....");
Object str = "zhangsan";
Integer num = (Integer)str;
}
}测试
异常映射 exceptionMappings
- 配置异常处理器 exceptionMappings
1 |
|
创建错误视图页面
1
2
3
4
5error1.jsp
<body>
<h1>类型转换异常</h1>
</body>1
2
3
4
5error2.jsp
<body>
<h1>自定义异常</h1>
</body>控制器产生异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class DemoServiceImpl implements DemoService {
@Override
public void show1() {
System.out.println("抛出类型转换异常....");
Object str = "zhangsan";
Integer num = (Integer)str;
}
@Override
public void show5() throws MyException {
System.out.println("自定义异常....");
throw new MyException();
}
}测试
实现异常处理接口 HandlerExceptionResolver自定义异常处理类
① 创建异常处理器类实现 HandlerExceptionResolver
② 配置异常处理器
③ 编写异常页面
④ 测试异常跳转
1. 创建异常处理器类实现 HandlerExceptionResolver
1 |
|
2. 配置异常处理器
1 |
|
3. 编写异常页面
1 |
|
4. 测试异常跳转
其他异常处理方式
HTTP异常状态统一处理
以 HTTP Status 404 为例。
创建一个用于进行异常提示的页面:404.jsp
1
2
3
4<body>
<center><h1>404 Not Found</h1></center>
<center><h1>页面找不到</h1></center>
</body>在web.xml中进行配置:
1
2
3
4<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
基于Servlet-api代码异常统一处理
创建异常提示页面:err.jsp
在web.xml中进行配置
1
2
3
4<error-page>
<exception-type>java.lang.ClassCastException</exception-type>
<location>/error1.jsp</location>
</error-page>
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!