软件构造复习:第六章(上)

目录

    • 健壮性和正确性
    • Throwable
    • Error/Runtime异常、其他异常
    • Checked异常、Unchecked异常
    • Checked异常的处理机制
    • 自定义异常类

健壮性和正确性

健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度
面向健壮性的编程:

  • 处理未期望的行为和错误终止
  • 即使终止执行,也要准确/无歧义的向用户展示全面的错误信息
  • 错误信息有助于进行debug

Robustness principle:对别人宽容点,对自己狠一点

正确性:程序按照spec加以执行的能力,是最重要的质量指标

ps.正确性倾向于直接报错(error),健壮性倾向于容错(fault-tolerance)
正确性:用不给用户错误的结果
健壮性:尽可能保持软件运行而不是总是退出

对外的接口,倾向于健壮;对内的实现,倾向于正确

可靠性=健壮性+正确性

Throwable

软件构造复习:第六章(上)_第1张图片
The Error(内部错误):程序员通常无能为力,一旦发生,想办法让程序优雅的结束

The Exception(异常):你自己的程序导致的问题,可以捕获、可以处理;程序执行中的非正常事件,导致程序无法按预想的流程执行

Error/Runtime异常、其他异常

Sort of errors:

  • 用户输入错误
  • 设备错误
  • 物理限制

在大多数时候,程序员不需要实例化Error。

Exception的两个分支:

  • RuntimeException 运行时异常:由程序员在代码里处理不当造成(如果在代码中提前进行验证,可以避免
  • 其他异常:由外部原因造成(即使在代码中提前加以验证,也无法完全避免

Checked异常、Unchecked异常

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:

  • ArrayIndexOutOfBoundsException
  • NullPointerException
  • NumberFormatException
  • ClassCastException
  • IllegalArgumentException
  • IllegalStateException
  • NoClassDefFoundError

Use checked or unchecked exceptions in your code?

  • 尽量使用unchecked exception来处理编程错误;
  • 如果client端对某种异常无能为力,可以把它转变为一个unchecked exception,程序被挂起并返回客户端异常信息
  • 不要创建没有意义的异常,client应该从checked exception中获取更有价值的信息(案发现场具体是什么样子),利用异常返回的信息来明确操作失败的原因。如果client仅仅想看到异常信息,可以简单抛出一个unchecked exception
  • 错误可预料,但无法预防,但可以有手段从中恢复,此时使用checked exception。如果做不到这一点,则使用unchecked exception。

Checked异常的处理机制

声明(Declaring exceptions):throws;“本方法可能会抛出XX异常”。

  • “异常”也是方法和client端之间spec的一部分,在post-condition中刻画,unchecked异常不需要写在spec中。
  • 抛出多个checked异常时,都要在方法签名中列出

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);
	}
}

你可能感兴趣的:(软件构造复习:第六章(上))