HIT软件构造:7.面向正确性与健壮性的软件构造

目录

一、健壮性和正确性

二、Throwable

三、Error/Runtime异常、其他异常

四、Checked、Unchecked

五、断言


一、健壮性和正确性

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

面向健壮性编程:

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

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

错误信息有助于进行debug

2.正确性:

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

正确性:永不给用户错误的结果

健壮性:尽可能保持软件运行而不是总是退出

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

3.可靠性:

Reliability = Robustness + Correctness

二、Throwable

The base class for all Exception objects is java.lang.Throwable, together with its two subclasses java.lang.Exception and java.lang.Error.

三、Error/Runtime异常、其他异常

1.error的种类

用户输入错误

设备错误

物理限制

2.Exception:

异常:程序执行中的非正常事件,程序无法再按预想的流程执行

将错误信息传递给上层调用者,并报告“案发现场”的信息

return之外的第二种退出途径

若找不到异常处理程序,整个系统完全退出

3.Runtime Exception and Other Exceptions:

The Exception hierarchy also splits into two branches:

– Exceptions that derive from RuntimeException 运行时异常

– Those that do not. 其他异常

运行时异常:由程序员在代码里处理不当造成

其他异常:由外部原因造成

RuntimeException:

– A bad cast

– An out-of-bounds array access

– A null pointer access

Other Exceptions:

– Trying to read past the end of a file

– Trying to open a file that doesn’t exist

– Trying to find a Class object for a string that does not denote an existing class

四、Checked、Unchecked

1.Checked Exceptions:

编译器可帮助检查你的程序是否已抛出或处理了可能的异常

2.Unchecked Exceptions:

Errors and Runtime Exceptions are not checked by compiler

Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做——掩耳盗铃,对发现的编程错误充耳不闻

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

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

– Checked exception应该让客户端从中得到丰富的信息。

– 要想让代码更加易读,倾向于用unchecked exception来处理程序中的错误

方法应该throws什么异常?

你所调用的其他函数抛出了一个checked exception——从其他函数传来的异常

当前方法检测到错误并使用throws抛出了一个checked exception——你自己造出的异常

The compiler strictly enforces the throws specifiers. If you call a method that throws a checked exception, you must either handle it or pass it on.

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

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

五、断言

When the precondition is not satisfied, this code terminates the program by throwing an AssertionError exception. The effects of the caller’s bug are prevented from propagating.

检查前置条件是防御式编程的一种典型形式

断言:在开发阶段的代码中嵌入,检验某些“假设”是否 成立。若成立,表明程序运行正常,否则表明存在错误。

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

实际运行阶段,不再使用断言

使用断言的主要目的是 为了在开发阶段调试程序、尽快避免错误

由于断言可能被禁用,因此程序的正确性不应该依赖于断言表达式被执行。

特别是,断言的表达不应有副作用。

–例如,如果要断言从列表中删除的元素在列表中找到的,不要这样写:

assert list.remove(x);

如果断言被禁用,则跳过整个表达式,并且x被忽略,从未从列表中删除。改为这样写:

boolean found = list.remove(x); assert found;

程序之外的事,不受你控制,不要乱断言

断言只是检查程序的内部状态是否符合规约

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

Java缺省关闭断言,要记得打开(-ea)

断言非常影响运行时的性能

断言->Correctness

错误/异常处理->Robustness

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值