zoukankan      html  css  js  c++  java
  • 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 登录

  • 相关阅读:
    关于Animator状态在运行时的正负方向播放
    测试-Animator的“当前剪辑CurrentAnimatorStateInfo”
    关于Unity实现游戏录制功能的思考
    关于UI功能解锁,UI特效动画,UI tips的再思考
    堆排序
    单元测试时使用Ninject的小问题
    又开一坑,运动图形MoGraph for Unity
    关于AnimationState的测试
    底层设计应该尽量避免泛型
    java8中计算两个日期时间LocalDateTime的时间差,格式化成xx年yy月zz日aa时bb分cc秒
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11364818.html
Copyright © 2011-2022 走看看