异常使用原理--异常的正确打开方式
今天在编写项目时突然明白异常的作用,于是就写下了这一篇。
异常是一个面向对象,或者说代码结构上的概念。下面用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,我们也可以自己加的。
异常类族
编写一组类的时候,常常也要附带一组异常。因为没有实际操作过,所以还不太清楚。