Java Exception 应用情景(一)

Java Exception 应用情景1:用户登录

经常在登录时,遇到“用户名或密码错误”这样的提示,让人搞不清楚究竟是用户名记错了,还是密码输错了。那么为什么程序员不将这两种情况分开提示呢?

   当Control层(如,servlet)直接调用Model层的”boolean login(String username, String password)”方法,服务器空间,login函数在用户名密码均正确时,返回true,否则返回false。编写Control层代码的程序员可以通过判断返回 的值来判断登录是否成功。但是,这样只能知道用户是否登录成功,但万一不成功,却无法获知登录失败的原因。

按照传统的做法,有两种方式可以进行“用户名不存在”和“密码错误”的分开提示:

1、在 Control层先调用Model层的 “boolean checkUsernameExist(String username)” 方法,判断用户名是否存在,若不存在则提示“用户名不存在”。若存在则将用户名和密码一起传入Model层的login方法进行函数调用,此时如果 login方法仍返回false,说明密码错误。

优势:不用改动Model层的方法就可以进行两种提示

弊端:Control层本应负责数据的打包转发(从view层接收数据,封装后转给Model层;从Model层获得回应,将数据重新组织后传给View层显示),但现在却混入了逻辑判断,Control层的职责变得有些含糊不清。

2、改动Model层的login方法,让它的返回值可以包含多种信息(如,“int login(String userName, String password)”,返回值0代表成功,1代表)。

优势:不需要Control层事先做额外的判断,只需要分析login函数的返回值就可以知道登录是否成功,以及不成功时的原因

弊端:需要Control层的程序员查看文档来获知Model层程序员对返回值的定义,API不够友好。

现在,让我们来分析一下login的流程:

  正常业务逻辑中的意外情况(会妨碍业务的正常进行的事件)就属于的异常情况,如果这个异常情况是可预知的,那么就应该定义为Checked Exception,比如用户名不存在或密码错误这种情况就属于可以预见的意外情况。

  异常处理的两项重要内容分别是:异常恢复和异常记录。

  异 常恢复的策略针对不同的异常原因而各有不同,例如数据库服务器连接失败时,可以自动间歇性重试;用户输入数据错误时,可以提示用户输入正确的数据,等等。 而异常记录则是相同的,一般是直接调用系统的日志插件进行记录,如logback的Logger对象的error方法,等等。

那么我们可以设计一个父类,网站空间,称为AppException,这个父类中完成异常处理的共性事务,如查询错误码对应的错误信息、记录错误、传递(保留)错误链等。因此,AppException可以定义如下:

View Code

import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 自定义异常的父类,所有异常均集成自此类. * * @author Elar * @version 2013.2.28 * AppException extends Exception {serialVersionUID = 1L;private String errorCode;private String errorInfo;public AppException(String errorCode, Exception e, String className){this.errorCode = errorCode;this.errorInfo = ErrorCode.getErrorCodeInfo(errorCode);this.initCause(e);log(className);}private void log(String className){Logger logger = LoggerFactory.getLogger(className);logger.error(errorCode + “: ” + errorInfo);}},香港服务器来说是非者,便是是非人。

Java Exception 应用情景(一)

相关文章:

你感兴趣的文章:

标签云: