第七章 面向健壮性的构造

Robustness 健壮性

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

  处理未期望的行为和错误终止

 即使终止执行,也 要准确/无歧义的向用户展示全面的错误信息

Correctness 正确性

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

正确性倾向于直接报错(error),健壮性则倾向于容错(fault-tolerance)

 Reliability(可靠性)= Robustness + Correctness

 Error and Exception in Java


内部错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束

异常:你自己程序导致的问题,可以捕获、可以处理

 Exception Handling

Runtime Exception: 运行时异常,由程序员处理不当造成

 Checked and unchecked exceptions
 Throwable


  Checked exceptions

除了error和runtimeException以外的其他的异常
声明异常或者对他进行处理。

  unchecked exceptions

error 和runtimeException

重构代码


– 不需要在编译的时候用try…catch等机制处理

必须捕获并指定错误 处理器handler,否则 编译无法通过。



 Declaring exceptions (throws) 声明“可能会发生异常” 

– Throwing an exception (throw)  抛出异常 

– Catching an exception (try, catch, finally) 捕获并处理异常

– 如果客户端可以通过其他的方法恢复异常,那么采用checked exception; 

– 如果客户端对出现的这种异常无能为力,那么采用unchecked exception;

– 如果client仅仅想看到异常信息,可以简单抛出一个unchecked exception:
   throw new RuntimeException("Username already taken");

错误可预 料,但无法预防,但可以有手段从中恢复,此时使用checked exception。

如果父类型中的方法没有抛出异常,那么子类型中的方法必 须捕获所有的checked exception

 子类型方法中不能抛出比父类型 方法更多的异常!

Rethrowing and Chaining Exceptions


本来catch语句下面是 用来做exception handling的,但也可以在catch里抛出异常
这么做的目的是:更改exception的类型,更方便client端获取错误信 息并处理

但这么做的时候最好保留“根原因”

finally Clause

当异常抛出 时,方法中正常执行的代码被终止

 如果异常发生前曾申请过某 些资源,那么异常发生后这些资源要被恰当的清理

不管是否发生异常


Analyzing Stack Trace Elements


Tips for Using Exceptions

当有异常被抛出的时候,如果不想恢复它,那么要毫不犹豫的将其转 换为unchecked exception,而不是用一个空的catch块或者什么也不做 来忽略它,以至于从表面来看象是什么也没有发生一样。

Assertions 断言

检查前置条件是防御式编程的一种典型形式,避免扩散

  出现AssertionError,意味着内部某些假设被违反了

断言即是对代码中程序员所做假设的文档化,也不会影响运行时性能( 在实际使用时,assertion都会被disabled)



前置条件和后置条件


控制流


断言主要用于开发阶段,避免引入 和帮助发现bug。

实际运行阶段,不再使用断言避免降低性能,使用断言的主要目的是 为了在开发阶段调试程序、尽快避免错误

外部错误要 使用Exception机制去处理

Assertion vs. Exception




调试的基本过程和方法



Reproduce the bug

Reproduce the bug

Reproduce the bug

从最小的测试用例开始复现错误

 Diagnosing the bug


Diagnosis stratagem 1: Instrumentation
Diagnosis stratagem 2: Divide and Conquer


测试


 先写测试会节省大量的调试时间


在等 价类划分时,将边界作为等价类之一加入考虑

不仅要考虑边界,还要考虑边界的两侧


White-box testing

独立/基本路径测试:对程序所有执行路径进行等价类划 分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试 用例使每一条基本路径被至少覆盖1次。


猜你喜欢

转载自blog.csdn.net/weixin_41145325/article/details/80726832