12 面向正确性与健壮性的软件构造

1什么是稳健性和正确性?

1.健壮性

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

2.面向健壮性的编程

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

错误信息有助于进行debug

3.稳健性原则(Postel定律)

1.总是假定用户恶意、假定自己的代码可能失败

2.把用户想象成白痴,可能输入任何东西,返回给用户的错误提示信息要详细、准确、无歧义

3.(Postel’s Law):对别人宽容点,对自己狠一点

4.封闭实现细节,限定用户的恶意行为

5.考虑极端情况,没有“不可能”

4.正确性

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

正确性与健壮性比较:

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pmKS2AQ-1655136815871)(img/image-20220610202103569.png)]

外部和内部:
外部接口(健壮性)(UI、输入文件、配置、API等)主要为用户和第三方服务。让他们变得健壮,并尽可能适应,期望人们会输入垃圾。
内部模型(正确性)(即域模型)应尽可能简单,并且始终处于100%有效状态。使用不变量和断言做出安全的假设,只要遇到任何不正确的情况,就抛出一个大的异常。
–在将无效输入传递给内部模型之前,使用反破坏层保护内部模型不受外部接口的影响,该层映射并纠正无效输入(如有可能)。

安全关键型应用程序倾向于支持正确性而不是健壮性。–与其返回错误的结果,不如不返回结果。
消费者应用程序倾向于支持健壮性和正确性。–任何结果通常都比关闭软件要好。

可靠性=正确性+健壮性

系统在规定的条件下执行所需功能的能力,无论何时需要,平均无故障时间较长。=

5.如何提升健壮性,正确性

步骤0:编写具有健壮性和正确性的代码
使用断言、防御性编程、代码审查、正式验证等实现目标
步骤1:观察故障症状(内存转储、堆栈跟踪、执行日志、测试)
步骤2:识别潜在故障(bug本地化、调试)

步骤3:修复错误(代码修订)

2 Java里的异常exception与错误error

内部错误error:Error类描述Java运行时系统内部很少发生的系统错误和资源耗尽情况
–不应该抛出这种类型的对象。
–如果发生这样的内部错误,除了通知用户并尝试优雅地终止程序之外,几乎无能为力。

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

3 异常处理

1.异常定义

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

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

如果每个方法不能正常方式完成其任务,Java允许每个方法都有一个可选的退出路径。
–该方法抛出一个封装错误信息的对象。
–该方法立即退出,不返回任何值。
–此外,在调用该方法的代码处不会恢复执行;
–相反,异常处理机制开始搜索可以处理此特定错误条件的异常处理程序。若找不到异常处理程序,整个系统完全退出

2.异常分类

在这里插入图片描述

运行时异常:由程序员在代码里处理不当造成,,是程序源代码中引入的故障所造成的

如果在代码中提前进行验证,这些故障就可以避免

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值