健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度
面向健壮性的编程:
Robustness principle:对别人宽容点,对自己狠一点
正确性:程序按照spec加以执行的能力,是最重要的质量指标!
ps.正确性倾向于直接报错(error),健壮性倾向于容错(fault-tolerance)
正确性:用不给用户错误的结果
健壮性:尽可能保持软件运行而不是总是退出
对外的接口,倾向于健壮;对内的实现,倾向于正确
可靠性=健壮性+正确性
The Error(内部错误):程序员通常无能为力,一旦发生,想办法让程序优雅的结束
The Exception(异常):你自己的程序导致的问题,可以捕获、可以处理;程序执行中的非正常事件,导致程序无法按预想的流程执行
Sort of errors:
在大多数时候,程序员不需要实例化Error。
Exception的两个分支:
Checked Exception:An error that every caller should be aware of and handle 。
You have to either catch and handle the exception, or tell compiler that you can’t handle it by declaring that your method throws that exception
编译器可帮助检查你的程序是否已抛出或处理了可能的异常。
必须捕获并指定错误处理器handler,否则编译无法通过
Unchecked Exception:Error+RuntimeException;不需要在编译的时候用try-catch等机制处理
可以不处理,编译没问题,但执行时出现就会导致程序失败,代表程序中的潜在bug
Common Unchecked Exception Classes:
Use checked or unchecked exceptions in your code?
声明(Declaring exceptions):throws;“本方法可能会抛出XX异常”。
Note.如果子类型中override了父类型中的函数,那么子类型中方法抛出的异常不能比父类型抛出的异常类型更广泛(即子类型方法可以抛出更具体的异常,也可以不抛出任何异常)。如果父类型的方法未抛出异常,那么子类型的方法也不能抛出异常。
抛出:throw;抛出XX异常;
throw new EOFException();
or
EOFException e=new EOFException();
throw e;
捕获并处理:try,catch;捕获并处理XX异常。
异常发生后,如果找不到处理器,就会终止执行程序,在控制台打印出stack trace。
try{
code
more code
more code
}catch(ExceptionType e){
handler for this type
}
ps.当try块中抛出在catch子句中指定的异常时,将忽略出现异常位置之后的代码,由catch子句进行异常处理。无异常抛出时,catch子句不执行。如果抛出的异常,在catch语句中没有匹配的异常处理,则被访问的程序退出(由client处理)
Pass the exception on to the caller:可以不在本方法内处理,而是传递给调用方,由client处理,在某些情况下,client更清楚如何处理。此时,需要在方法声明中声明(throws)异常
Note.Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做
清理现场和释放资源:finally;如果异常发生前曾申请过某些资源,那么异常发生后这些资源要被恰当的清理。A better solution :the finally clause。Finally部分的代码,是否捕获异常都会被执行。
如果JDK提供的exception类无法充分描述你的程序发生的错误,可以创建自己的异常类,习惯上同时给出一个默认构造器函数和一个包含详细信息的构造函数。
eg.
public class FooException extends Exception{
public FooException(){
super();
}
public FooException(String message){
super(message);
}
public FooException(String message,Throwable cause){
super(message,cause);
}
public FooException(Throwable cause){
super(cause);
}
}