课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java培训:提倡异常封装
  • java培训:提倡异常封装

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-19

  • 昆明Java培训的老师今天给大家讲java中提倡异常封装。

    Java语言的异常处理机制可以去确保程序的健壮性,提高系统的可用率,但是Java API提供的异常都是比较低级的(这里的低级是指"低级别的"异常),只有开发人员才能看的懂,才明白发生了什么问题。而对于终端用户来说,这些异 基本上就是天书,与业务无关,是纯计算机语言的描述,那该怎么办?这就需要我们对异常进行封装了。异常封装有三方面的优点:

    (1)、提高系统的友好性

    例如,打开一个文件,如果文件不存在,则回报FileNotFoundException异常,如果该方法的编写者不做任何处理,直接抛到上层,则会降低系统的友好性,代码如下所示:

    public static void doStuff() throws FileNotFoundException {

    InputStream is = new FileInputStream("无效文件.txt");

    /*文件操作*/

    }

    此时doStuff的友好性极差,出现异常时(如果文件不存在),该方法直接把FileNotFoundException异常抛到上层应用中(或者是最终用户),而上层应用(或用户要么自己处理),要么接着抛,最终的结果就是让用户面对着"天书"式的文字发呆 用户不知道这是什么问题,只是知道系统告诉他" 哦,我出错了,什么错误?你自己看着办吧"。

    解决办法就是封装异常,可以把异常的阅读者分为两类:开发人员和用户。开发人员查找问题,需要打印出堆栈信息,而用户则需要了解具体的业务原因,比如文件太大、不能同时编写文件等,代码如下:

    public static void doStuff2() throws MyBussinessException{

    try {

    InputStream is = new FileInputStream("无效文件.txt");

    } catch (FileNotFoundException e) {

    //方便开发人员和维护人员而设置的异常信息

    e.printStackTrace();

    //抛出业务异常

    throw new MyBussinessException();

    }

    /*文件操作*/

    }

    (2)、提高系统的可维护性

    看如下代码:

    public void doStuff3(){

    try{

    //doSomething

    }catch(Exception e){

    e.printStackTrace();

    }

    }

    这是大家很容易犯的错误,抛出异常是吧?分类处理多麻烦,就写一个catch块来处理所有的异常吧,而且还信誓旦旦的说" JVM会打印出栈中的错误信息",虽然这没错,但是该信息只有开发人员自己看的懂,维护人员看到这段异常 基本上无法处理,因为需要到代码逻辑中去分析问题。

    正确的做法是对异常进行分类处理,并进行封装输出,代码如下:

    public void doStuff4(){

    try{

    //doSomething

    }catch(FileNotFoundException e){

    log.info("文件未找到,使用默认配置文件....");

    e.printStackTrace();

    }catch(SecurityException e1){

    log.info("无权访问,可能原因是......");

    e1.printStackTrace();

    }

    }

    如此包装后,维护人员看到这样的异常就有了初步的判断,或者检查配置,或者初始化环境,不需要直接到代码层级去分析了。

    (3)、解决Java异常机制自身的缺陷

    Java中的异常一次只能抛出一个,比如doStuff方法有两个逻辑代码片段,如果在第一个逻辑片段中抛出异常,则第二个逻辑片段就不再执行了,也就无法抛出第二个异常了,现在的问题是:如何才能一次抛出两个(或多个)异常呢?

    其实,使用自行封装的异常可以解决该问题,代码如下:

    class MyException extends Exception {

    //容纳所有的异常

    private List<Throwable> causes = new ArrayList<Throwable>();

    //构造函数,传递一个异常列表

    public MyException(List<? extends Throwable> _causes) {

    causes.addAll(_causes);

    }

    //读取所有的异常

    public List<Throwable> getExceptions() {

    return causes;

    }

    }

    MyException异常只是一个异常容器,可以容纳多个异常,但它本身并不代表任何异常含义,它所解决的是一次抛出多个异常的问题,具体调用如下:

    public void doStuff() throws MyException {

    List<Throwable> list = new ArrayList<Throwable>();

    //第一个逻辑片段

    try {

    // Do Something

    } catch (Exception e) {

    list.add(e);

    }

    //第二个逻辑片段

    try {

    // Do Something

    } catch (Exception e) {

    list.add(e);

    }

    //检查是否有必要抛出异常

    if (list.size() > 0) {

    throw new MyException(list);

    }

    }

    这样一来,DoStuff方法的调用者就可以一次获得多个异常了,也能够为用户提供完整的例外情况说明。可能有人会问:这种情况会出现吗?怎么回要求一个方法抛出多个异常呢?

    昆明Java培训的老师知道绝对有可能出现,例如Web界面注册时,展现层依次把User对象传递到逻辑层,Register方法需要对各个Field进行校验并注册,例如用户名不能重复,密码必须符合密码策略等,不要出现用户第一次提交时系统 示"用户名重复",在用户修改用户名再次提交后,系统又提示"密码长度小于6位"的情况,这种操作模式下的用户体验非常糟糕,最好的解决办法就是异常封装,建立异常容器,一次性地对User对象进行校验,然后返回所有的异常

    推荐文章

上一篇:java培训:生成树的结构

下一篇:java中采用异常链传递异常

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56