软件构造第六章——面向健壮与正确的软件设计上

fault、failure和error区别 max1=y,max2=y,理应z和y再比较得出最大值为y,却因为第二个if语句执行但没有覆盖掉max1的值得到了期望值max2=y。max1=y,max2=z,max2值覆盖掉了max1的值,使得期望值和实际值不符即程序段功能失效,得出错误的最大值。(1)程序段中用了两个if语句,第一个if执行之后不管结果如何都会执行第二个if语句,而第二个if只对z和x作比较,max的结果可能将会被覆盖。(4)设计1个测试数据,使得执行该测试时会执行到fault,触发error,并引起Failure。 阅读详情

一.正确性与健壮性

健壮性:程序在用户非法输入下,非法环境下表示正常的程度,也可以叫鲁棒性。
面对用户输入错误时,要能提示错误,处理未期望行为,并且应该要显示有助于DEBUG的错误信息。
健壮性原则
1.伯斯塔尔原则:对自己严格,对他人宽容。
封闭全部细节,考虑所有情况。

正确性:程序按照spec执行的能力。正如第二章就说明的,spec是决定正确性的。
与健壮性对比
1.健壮性倾向于用户,容纳用户的输入错误。
正确性倾向于开发者,对不符合spec的输入任意处理。
2.健壮性倾向于对外接口,正确性倾向于对内实现。
对此我的理解是健壮性倾向于在调用方法时,按照spec选择不合法数据并加以处理,正确性倾向于保证内部实现一定按照spec进行

在不同条件下,我们需要不同的权衡。
比如我们对于银行卡密码输入错误,就不能对其进行容错。
可靠性:程序在规定条件下执行功能的能力。
可靠性=健壮+正确性

几个名词解释

error,bug,failure
error:程序开发人员的错误。
bug:错误导致的功能上的问题
failure:问题外部表现导致程序失效
嘛,用马克思联系的观点看,failure是bug的表现,bug是failure的实质,而error是bug的因果。
程序员把+打成-号是错误,错误导致这部分运算不符合要求是bug,用户调用发现5+3=2是failure.

面向健壮性编程步骤

1.编程时注意正确性与健壮性
技术手段:断言,代码审查,防御式编程
2.观察测试发现问题发现正确性或健壮性不足
技术手段:内存转储,执行日志,堆栈树
3.确认bug所在
技术手段:bug localization, 调试器
4.修复bug
code revision

嘛一个总结上面
编码要理解正确性健壮性,测试要确认正确性健壮性,DEBUG要提升正确健壮性。

异常与错误处理

分类

JAVA中把未期望的执行,分为两类异常和错误。
二者都继承自Throwable接口,可以抛出。
错误:发生在内部,程序员无能为力,无法处理。
虚拟机错误,配置错误。
倒是有意思的是断言错好像也是error。
错误不是我们的程序造成的,我们无法处理也不能管它。
异常:自己程序导致的问题,我们应该处理。

异常处理

异常:程序中发生的非正常事件,已经发生不能继续执行下去了。
异常类会把事件发生时候的信息传递给上层程序,等待异常处理程序
来完成,目前程序会返回,是return后的第二个返回机制。
没有异常处理程序自动终结。
提供专门的异常类有很多好处
1.不会忘记处理异常,编译器强迫。
2.提供更好的异常信息摘要
3.代码结构更好
4.健壮性与可维护性更好了。

异常的进一步分类

异常分为:运行时异常(RuntimeException)
和其他异常。
运行时异常是由于程序员代码处理不当造成的。
而其他异常是外部造成的
运行时异常是完全可以修改代码避免的,比如空指针,可以检验后调用,数组长度不够,代表我们应该加大数组了。
而其他异常不是我们的代码问题。

受检异常和非受检异常

二者是在异常处理的机制上对异常的划分,但是非受检就是运行时异常和error。
异常发生时,我们需要告诉编译器,我们可以解决这个异常或不能解决我们要向上抛出。
对于受检异常,编译器要求我们必须告诉如何处理。
而对于runtimeexception 与 error编译器不强制要求我们处理,他们是非受检异常。
1.对于error,我们代码无法管。
2.对于runtimeexception这显示我们有编程错误,我们应该修改代码,而不是处理错误。
在自定义异常类时,非受检异常继承自runtimeexception,受检异常直接继承exception.
|

受检异常未受检异常
必须显式捕获传递异常不必显示捕获传递
继承自exceptionruntimeexception
从异常发生的现场获取详细的信息,利用 异常返回的信息来明确操作失败的原因, 并加以合理的恢复处理简单显示无法处理
正常与异常代码混合逻辑清楚明白
受检异常与非受检异常选用

1.如果客户端对异常无能为力,用非受检异常。
如果客户端能通过其他的方法恢复异常,受检异常。
2.对于编程错误尽量使用非受检异常来处理。
3.要想简洁易读,用非受检异常。
要详细信息用受检异常。
4.对于可预料,无法预防,可恢复用受检异常。
否则非受检异常
5.可合理恢复受检异常。用受检异常表示意外结果,用非受检异常表示bug

throws声明抛出异常

异常是spec的一部分,很好理解,异常是程序从意外的地方退出,其实类似于return,在后置条件刻画。
JAVA中的规约标注@throws
一般两种情况需要注明异常抛出
1.你真的抛出了一个异常,用throw了
2.你调用的方法抛出了异常,而且你没有处理这个异常。

【Linux】常见指令的使用 Linux常用指令 阅读详情

相关推荐

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

伯斯塔尔法则

发送时保守,接收时开放。 发送时保守:这一点主要是用来告诫开发人员的。作为一名开发人员,你一定要遵循代码世界里的规范。你的代码必须要写的标准,生成的一定要谨慎,尽量不要引起各种错误,这样才能使得浏览器很好的进行解析。 接受时开放:这一点是为了不让你的用户产生不好的体验。如果一个开发人员,代码写得就是天马行空,就是不遵循HTML标准,而作为浏览器你要足够的开放,可以...

Im_IronMan的博客 584

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 298

接口设计原则

1、单一原则 一个类只负责一个功能领域的相应职责,或者可以定义为,就一个类而言,应该只有一个引起它变化的原因。 单一原则的实现,完全取决于你这么抽象的看待这个问题,你抽象的合适,那么它可以很棒,如果抽象的不够,它可能就是臃肿的类,抽象的过多,有可能创造出一大把寄生类。 单一职责原则这话就像我们常听的那句"做人要坚持"。听起来无懈可击,但是要坚持什么呢,如果这事情看起来不靠谱,做...

永生只是一场幻梦 8604

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。还原数据库时把序列取消勾选,选择不还原序列。因为还原表的同时,会自动将自增序列还原上去,此处勾选会导致数据库重复创建序列。点击还原数据库完毕后,可以看到序列仅有一个,没有出现重复序列。但此时的序列当前值是从1开始的,需要重置。点击菜单“其它”-》“序列”,可以看到有多个重复序列。

奋斗鱼 1044

AlphaPose复现配置教程

AlphaPose是一种准确的多人姿态估计器,这是第一个在COCO数据集上达到70+ mAP (75 mAP)和在MPII数据集上达到80+ mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态,我们还提供了一种高效的在线姿态跟踪器,称为Pose Flow。这是第一个在PoseTrack挑战数据集上达到60+ mAP (66.5 mAP)和50+ MOTA (58.3 MOTA)的开源在线姿态跟踪器。AlphaPose支持Linux和Windows操作系统!指路👉。

m0_56661101的博客 4527

error bug fault failure defect区别

failure(失败) 是用来描述软件问题的可见部分,即外在的表现和症状。 error是导致这种表象的内因。 fault是指因为内因而导致表象出现的那个错误状态。 bug和defect是对软件错误和失败的通用说法。 ...

chikuomin5059的博客 2460

科研效率革命:Zotero与Web of Science联动实现千篇文献一键获取

本文详细介绍了如何利用Zotero与Web of Science联动实现科研文献的高效管理,包括批量导入、智能下载和自动整理千篇文献的技巧。通过精准检索、RIS文件导出和Zotero插件设置,科研人员可以大幅提升文献获取和管理的效率,特别适合开题报告和综述写作等场景。

weixin_29219539的博客 255

Java基础-第六章(面向对象1)

一.软件的开发概述 软件设计的原则: 为了提高软件的开发效率,降低软件开发成本,一个优良的软件系统应该具有以下特点: 1.可重用性 遵循DRY原则,减少软件中的重复代码; 2.可扩展性 当软件需要升级增加新的功能,能够在现有的系统架构上方便的创建新的模块,而不需要改变软件的现有结构,也不会影响已经存在的模块; 3.可维护性 当用户需求发生变化时,只需要修改局部模块中少量...

北川Alex的个人博客 698

TexGen模型导出到ABAQUS的inp文件:如何快速修改纱线材料属性(避坑指南)

本文针对TexGen模型导出到ABAQUS的inp文件后纱线材料属性缺失或错误的问题,提供了高效的解决方案。文章详细解析了inp文件结构,指导用户如何手动定位并修改纱线材料属性,并提供了可批量处理的Python脚本,帮助用户快速、精准地完成材料参数赋值,有效提升复合材料仿真工作效率。

ice55的博客 603

第076篇:大涡模拟进阶

大涡模拟(Large Eddy Simulation, LES)是介于直接数值模拟(DNS)和雷诺平均方法(RANS)之间的重要湍流模拟方法。本文深入介绍动态Smagorinsky模型、尺度相似模型、WALE模型和隐式LES等高级亚格子模型。通过Python实现槽道湍流和圆柱绕流的LES求解器,详细展示近壁面处理、动态系数计算和亚格子应力建模技术。大涡模拟,亚格子模型,动态模型,Smagorinsky,WALE模型,尺度相似模型,近壁面处理,槽道湍流LES的核心思想是对Navier-Stokes方程进行空间

2401_87715305的博客 740

Review of Software Construction

ソフトウェア構築の復習 @1.0 ver. © Yongyan Wen 2019 2019.6.18 文章目录ソフトウェア構築の復習@1.0 ver.© Yongyan Wen 20192019.6.18@[toc]第一章第一节 软件构造的多维视图Buildtime概述Runtime概述第二节 软件开发的质量属性外部质量属性内部质量属性五个关键的质量属性第二章第一节 软件生命周期和版本控制(配置管...

FZ6576625523的博客 1217

Arduino IDE 开发ESP32-S3编译报错 Sketch too big?一步步解决!

解决方法很简单,只需要一步步来修改 Arduino IDE 的配置即可。确保你已经打开 Arduino IDE 并加载了你的 ESP32 代码。如果你也遇到了这个问题,按这个方法试试,应该就能顺利搞定!,如果你需要 OTA,就不能选这个方案,需要换成。,但我回头一想,我这块 ESP32-S3 可是。,按理说存储空间应该足够啊,那这到底是咋回事?,默认方案就装不下了,这时就需要选择更大的。按钮,这次应该不会报错了!,然后在下拉菜单中找到。,可以支持更大的固件。如果你的固件体积超过。,就能正常编译上传。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2137

C++ 面向对象编程揭秘(一)

公司需要利用 C++的速度。然而,面向对象的软件设计会导致更容易修改和维护的代码。了解如何将 C++作为面向对象的语言使用是至关重要的。在 C++中编程并不能保证面向对象编程-必须理解面向对象的概念以及它们如何映射到 C++语言特性以及面向对象编程技术。此外,程序员还希望掌握超出面向对象编程的额外技能,以使代码更通用、更健壮,并采用经过充分测试的创造性解决方案,这些解决方案可以在流行的设计模式中找到。学习如何将 C++作为面向对象语言使用的程序员将成为有价值的 C++开发人员。一个没有面向对象理解和技能的

龙哥盟 506

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

解密 C++ 面向对象编程(一)

公司选择使用 C++是因为其速度;然而,面向对象(OO)的软件设计导致代码更健壮,更容易修改和维护。因此,了解如何将 C++用作面向对象(OOP)语言是至关重要的。在 C++中编程并不能保证面向对象(OOP)编程(OOP)——您必须理解面向对象(OO)概念以及它们如何映射到 C++语言特性和编程技术。此外,程序员还希望掌握超出面向对象(OOP)的额外技能,以使代码更通用和健壮,并采用在流行设计模式中可以找到的经过良好测试的创造性解决方案。

龙哥盟 550

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

软件测试工程师20套笔试题及参考答案-测试基础

试述软件的概念和特点?软件复用的含义?构件包括哪些? 瀑布模型和螺旋模型的主要区别是什么? 软件生存周期及其模型是什么? 什么是软件测试?软件测试的目的与原则 净室软件工程的策略是什么? 软件配置管理的作用?软件配置包括什么? 什么是软件质量?软件包是什么? 目前主要的测试用例设计方法是什么? 软件的安全性应从哪几个方面去测试? 参考答案: 答案如下: 软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、文档的完整集合。 软件复用(Software Reuse)是将已有软件的各种有关知识用于建立新的.

chenleismr的专栏 2134

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

软件体系结构 期末复习

复习 软件体系架构!

加油写代码 819

C# 和 .NETCore 设计模式实用指南(一)

本书的目的是让读者对现代软件开发中的模式有一个广泛的理解,同时通过具体示例深入了解更多细节。在开发解决方案时使用的模式数量是庞大的,而且通常开发人员在不知情的情况下使用模式。本书涵盖了从低级代码到在云中运行的解决方案中使用的高级概念的模式。尽管许多所呈现的模式不需要特定的语言,但 C#和.NET Core 将用于许多示例。选择 C#和.NET Core 是因为它们的流行和设计,支持从简单的控制台应用程序到大型企业分布式系统的解决方案构建。

龙哥盟 1465

C++ 软件架构(一)

现代 C++允许您在高级语言中编写高性能应用程序,而不会牺牲可读性和可维护性。不过,软件架构不仅仅是语言。我们将向您展示如何设计和构建健壮且可扩展且性能良好的应用程序。本书包括基本概念的逐步解释、实际示例和自我评估问题,您将首先了解架构的重要性,看看一个实际应用程序的案例研究。您将学习如何在单个应用程序级别使用已建立的设计模式,探索如何使您的应用程序健壮、安全、高性能和可维护。然后,您将构建连接多个单个应用程序的更高级别服务,使用诸如面向服务的架构、微服务、容器和无服务器技术等模式。

龙哥盟 220

(附源码)springboot 基于HTML5的个人网页的网站设计与实现-毕业设计 课程设计 031623

个人网页网站项目的概述设计分析,主要是个人网页网站的具体分析,进行数据库的是设计,数据采用mysql数据库,并且对于系统的设计采用比较人性化的操作设计,对于系统出现的错误信息可以及时做出处理及反馈。 个人网页网站基于现有的网络开发,可以实现管理员,用户管理(管理员、用户注册)更多管理(网站资讯管理、资讯分类管理、个人展示管理)等详细的了解及统计分析。实现用户:首页、个人信息展示

Q_3461074420的博客 2165

计算机操作系统总体框图,第1章操作系统引论(计算机)分析.ppt

第1章操作系统引论(计算机)分析操作系统 主讲教师:张金泉 电 话办 公 室:J13#318 E-mail:tjzhangjinquan@126.com 考试安排 平时成绩(30%) 考勤30分(M1) 缺勤1次减6分,迟到1次减3分 作业30分(M2) 缺1次减5分,抄袭1次减5分 小测试40分(M3) 期末考试(70%,M4) 总成绩=(M1+M2+M3)*30%+M4*...

weixin_42131861的博客 475

(附源码)node.js旅游景点分享网站-计算机毕设 课程设计03796

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计,主要的模块包括查看后台首页、轮播图(轮播图管理)、网站公告管理(网站公告)、资源管理(旅行资讯、资讯分类)、商城管理(商品中心、分类列表、订单列表)、系统用户(管理员、注册用户)、模块管理(地区管理、景点分类、房型管理、景点信息、景点购票、酒店信息、酒店预订、旅行分享)等功能。系统中管理员主要是为了安全有效地存储和管理各类信息,还可以对系统进行管理与更新维护等操作,并且对

Q_3461074420的博客 1488
上一篇: 软件构造第五章——面向可维护性的设计模式
下一篇: 探究一下try返回后finally还能返回是怎么在java虚拟机实现的?
入过栈你
博客等级 码龄7年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值