异常使用原理--异常的正确打开方式

       今天在编写项目时突然明白异常的作用,于是就写下了这一篇。

       异常是一个面向对象,或者说代码结构上的概念。下面用java示例,但异常的理念在各种语言中都是通用的。

 

异常语法总结

具体的语法就不再细说了,异常主要有以下的几部分语法:

1 try-catch-finally的语法结构

2理解异常的抛出过程(栈展开)

3 throw new excepttion(""),自主抛出异常。利用这一点可以有,异常重新抛出

try{

...

}catch(Exception e){

throw new excepttion("");

}

4 抛出异常的函数声明

private String checkState() throws Exception{}

 

异常的作用

       异常是用来干什么的?非常定性的说法是,“异常是用于处理错误”。笔者曾经非常天真的认为,比如当输入的参数不合理时,异常就会做一些处理,来修复这种不合理。也没几个人像我这么天真了~~~实际上异常就是用来“提示错误”的。

       回想一下我们刚编程时提示错误的方法:

public class Test{

    public void process(String param1, String param2, String param3){

        String result="";

        result=process1(param1);

        result=process2(param2);

        result=process3(param3);

        //把处理结果写入到日志

        Log.write(result);

       

    }

    private String process1(String param1){

        if(param1==null) return "param1 is not right";

        String result=process11(param1);

    }

    private String process11(String param1){

        if(param1.indexOf("wwww")<0) return "param1 don't have www";

        return "";

    }

    private String process2(String param2){

        if(param2==null) return "param2 is not right";

        return "";

    }

    private String process3(String param3){

        if(param3==null) return "param3 is not right";

        return "";

    }

}

 

这里有几个问题:

1使用了返回值存放错误提示,当函数本来就需要返回值时行不通

2当类里面层级结构更复杂(比如说上面的process11),有4,5层调用时,这种层层传递的错误提示比较难维护。

3上面并没有保证出第一个问题时就停止执行,而且报告第一个错误。如果要实现这一点就要写很多if语句,在层次复杂时更难维护。

 

用了异常可以这样写:

public class Test{

    public void process(String param1, String param2, String param3){

        String result="";

        try{

            _process(param1,param2,param3);

        }

        catch(Exception e){

            result=e.getMessage();

        }

        //把处理结果写入到日志

        Log.write(result);

    }

    private void _process(String param1, String param2, String param3) throws Exception{

        process1(param1);

        process2(param2);

        process3(param3);

    }

    private void process1(String param1) throws Exception{ 

        if(param1==null) throw new Exception("param1 is not right");

    }

    private void process11(String param1) throws Exception{

        if(param1.indexOf("wwww")<0) throw new Exception("param1 don't have www");

    }

    private void process2(String param2) throws Exception{

        if(param2==null) throw new Exception("param2 is not right");

    }

    private void process3(String param3) throws Exception{

        if(param3==null) throw new Exception("param3 is not right");

    }

}

 

 

怎么处理异常

      处理异常就是try,catch住异常,之后处理它。

      异常的处理不是解决错误,而是错误提示或错误汇报,可以有以下的处理方式:

      1提示到专门的用户界面,比如console,或者网页中的错误提示页

      2写入日志

      3完全不处理,忽视异常,任由系统down掉

      4打印异常栈,供调试。

      等等

 

什么时候处理异常

      软件系统中类层次那么复杂,什么时候处理异常呢?

      如果是封装类给别人用,那就不用处理异常;

      一般在界面层才处理异常,但具体的这条界线怎么界定,还是要做了项目后才有体验。

 

异常不是异类

      异常不是异类,不要恐惧异常。异常不光是给程序员调试用的,程序员不需要保证软件在具体执行时没有异常。相反地,应该用好异常来完成错误的提示和汇报。

 

运行时异常和非运行时异常

      在函数中有异常上名的异常叫非运行时异常。

      实际运行中出现的问题,如空对象调用,除以0等,不加函数异常声明eclipse不会提示错误的,叫做运行时异常。

      我提到这一点是为了说明,即使eclipse不叫我们加try-catch,我们也可以自己加的。

 

异常类族

      编写一组类的时候,常常也要附带一组异常。因为没有实际操作过,所以还不太清楚。

posted @ 2015-07-14 14:26  浅井光一  阅读(1412)  评论(0编辑  收藏  举报