Spring入门-对异常的处理

Posted 斐波那切

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring入门-对异常的处理相关的知识,希望对你有一定的参考价值。

对异常的处理,除了使用try-catch外,在Spring下还提供了配置简单异常处理和使用@ExceptionHandler注解的方法,另外异常还有系统异常和应用异常的区别,针对不同的异常如何抛送给用户也需要考虑。

应用异常和系统异常

系统异常:由于系统故障导致的异常,如网络中断、数据库关闭这种的,导致访问失败归为系统异常

应用异常:由于用户操作不当导致的异常,如填写错误用户名和密码,或者不是按照业务正常的逻辑使用页面,归为应用异常

参考前面刚做的登录界面,如果用户输入错误用户名或密码,则是应用异常,如果用户登录时数据库被关闭了出现的异常,则是系统异常,针对两种异常,需要区分后抛送给用户,参考第一篇博文,它定义了一个异常类来专门区分,将应用异常全部抛送为自定义异常,系统异常为其他异常。

(1)异常的try-catch处理

自定义异常类

 1 package com.boe.exception;
 2 
 3 public class ApplicationException extends RuntimeException{
 4     public ApplicationException() {
 5         
 6     }
 7     //用此创建的对象,可以用getMessage来获取错误信息
 8     public ApplicationException(String message) {
 9         super(message);
10         // TODO Auto-generated constructor stub
11     }
12 }

在catch里根据异常的类型不同,抛出不同的提示给用户做到区分。如下第18行,通过实例化对象判断实现区分,是应用异常,就获取业务层抛出的错误信息,将其发送给login页面并提示,如果是系统异常就进入loginNG界面。

 1 //验证登录
 2     @RequestMapping("/logincheck.do")
 3     public String login(userInfo data,ModelMap mm,HttpSession session) {
 4         System.out.println("登录验证");
 5         System.out.println("用户名为:"+data.getUser());
 6         System.out.println("密码为:"+data.getPwd());
 7         //处理业务层异常
 8         try {
 9             Admin admin=service.checkLogin(data.getUser(), data.getPwd());
10             if(admin!=null) {
11                 System.out.println("登录成功");
12                 mm.addAttribute("user",data.getUser());
13                 //登录成功后,将admin信息存入session
14                 session.setAttribute("loginData", admin);
15             }            
16         }catch(Exception e) {
17             //应用错误,即用户填写错误
18             if(e instanceof ApplicationException) {
19                 mm.addAttribute("login_fail", e.getMessage());
20                 mm.addAttribute("username",data.getUser());
21                 mm.addAttribute("password", data.getPwd());
22                 return "login";
23             }
24             //系统错误
25             return "loginNG";
26         }
27         return "loginOK";
28     }

(2)异常借助Spring简单异常处理

修改上面登录验证方法,将try-catch去掉简,在Spring下也可以实现异常处理,需要在applicationContext.xml文件中配置简单异常处理,它有个弊端,就是不能预估所有可能抛出的异常,每次新增抛出一次异常需要添加一个配置不能覆盖所有的异常,不能对异常做复杂处理,如本例中无法将异常消息传递给登录页面。

修改后登录login方法

 1 //验证登录
 2     @RequestMapping("/logincheck.do")
 3     public String login(userInfo data,ModelMap mm,HttpSession session) {
 4         System.out.println("登录验证");
 5         System.out.println("用户名为:"+data.getUser());
 6         System.out.println("密码为:"+data.getPwd());
 7         //处理业务层异常
 8         /**
 9         try {
10             Admin admin=service.checkLogin(data.getUser(), data.getPwd());
11             if(admin!=null) {
12                 System.out.println("登录成功");
13                 mm.addAttribute("user",data.getUser());
14                 //登录成功后,将admin信息存入session
15                 session.setAttribute("loginData", admin);
16             }            
17         }catch(Exception e) {
18             //应用错误,即用户填写错误
19             if(e instanceof ApplicationException) {
20                 mm.addAttribute("login_fail", e.getMessage());
21                 mm.addAttribute("username",data.getUser());
22                 mm.addAttribute("password", data.getPwd());
23                 return "login";
24             }
25             //系统错误
26             return "loginNG";
27         }
28         */
29         //不使用try-catch
30         Admin admin=service.checkLogin(data.getUser(), data.getPwd());
31         if(admin!=null) {
32             System.out.println("登录成功");
33             mm.addAttribute("user",data.getUser());
34             //登录成功后,将admin信息存入session
35             session.setAttribute("loginData", admin);
36         }
37         return "loginOK";
38     }

applicationContext.xml中配置简单异常处理

1 <!-- 配置简单异常类SimpleMappingExceptionResolve -->
2     <!-- 应用异常 -->
3     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
4       <property name="exceptionMappings">
5          <props>
6            <prop key="com.boe.exception.ApplicationException">login</prop>
7          </props>
8       </property>
9     </bean>

输入错误的用户名或者密码后,会重新进入登录页面,但是不能提示到底是用户名错还是密码错。

(3)使用注解@ExceptionHandler的方式

可以看到上面提示无法解决,使用注解的方式就可以。

step1 在处理器当中添加一个异常处理方法,该方法前面需添加@ExceptionHandler注解

step2 在异常处理方法里面,依据异常类型做异常处理,提示用户

 1     /**
 2      * 添加异常处理方法,使用注解@ExceptionHandler
 3      * @param e 方法抛出的异常
 4      * @param request 请求
 5      * @return 视图名
 6      */
 7     @ExceptionHandler
 8     public String exceptionHandler(Exception e,HttpServletRequest request) {
 9         if(e instanceof ApplicationException) {
10             //应用异常,获取异常信息,并发送浏览器
11             request.setAttribute("login_fail", e.getMessage());
12             //返回登录页面
13             return "login";
14         }else {
15             //系统异常,进入loginNG界面
16             return "loginNG";
17         }
18     }

再次输入错误用户名或密码,将能提示用户。

总结

以上是错误处理的三种方式,在区分异常类型方面,可以使用try-catch或者@ExceptionHandler注解的方式,配置简单异常的也可以但是存在弊端,无法将具体错误信息返回,并且有多少个异常就需要配置多少信息(key=异常类全名,value=视图名)。

 

参考博文:

(1)https://www.cnblogs.com/youngchaolin/p/11354307.html 登录

以上是关于Spring入门-对异常的处理的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security入门(3-4)Spring Security 异常处理异常传递和异常获取

spring boot快速入门 8: 异常处理

Spring Boot入门——全局异常处理

如何使用 Spring Boot 对 WebFlux 进行异常处理?

异常和TCP通讯

Unit06: Spring对JDBC的 整合支持 Spring+JDBC TemplateSpring异常处理