实验目标
本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处 理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序 可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后 可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。
实验针对 Lab 3 中写好的 ADT 代码和基于该 ADT 的三个应用的代码,使用 以下技术进行改造,提高其健壮性和正确性:
⚫ 错误处理
⚫ 异常处理
⚫ Assertion 和防御式编程
⚫ 日志
⚫ 调试技术
⚫ 黑盒测试及代码覆盖度
3.1. Error and Exception Handling
首先是异常类的设计以及异常的处理
抽象类FormatException继承Exception类:
private String exception;
protected String type;
子类为:
LabelNotRegularException //label格式错误
SameNameException //具有相同名字
SentenceNotRegularException //sentence格式错误
NumberNotRegularException /number格式错误
抽象类StellarSystemException继承Exception类:
protected String exception;
public String getException()
public static boolean degreeIsLeagel
public static boolean directionIsleagal
子类为:
DegreeNotRegularException //角度取值范围错误
DirectionException //旋转方向错误(不是CW或CCW)
抽象类AtomStructureException继承Exception类:
public static boolean elementNameIsLeagel
public static boolean numberOfTracksIsLeagel
子类为:
NumberOfTracksException //使用的轨道数与存在的轨道数不符
ElementNameException //元素名称不合法
抽象类PersonalAppEcosystemException继承Exception类:
public static boolean periodIsLeagel
子类为:
PeriodException //Period格式不正确
AppNotExistException //使用了不存在的App
在读取文件时,除了会遇到IOException以外,当读取Label类型、number类型、sentence类型的数据时,如果格式不正确也会抛出相应异常。
3个应用除去读取文件时发生的异常,其它异常均为相应应用名称异常的子类。
StellarSystem在构造函数中捕获到异常时会直接输出相应的错误
AtomStructure类在构造函数中捕获到异常时会直接输出相应的错误
PersonalAppEcosystem:
创建系统时抛出异常,需要在main函数中捕获并处理
3.2 Assertion and Defensive Programming
防御性编程
使用checkRep()检查invariants:
3.3 Logging
创建logger:
捕获到异常时进行记录
日志查询:
定义Record类
利用正则表达式将每一个标签抓取出来,存储到一个Record类中
实验总结
通过本次实验,我主要学习到了Exception的定义与处理和Log的使用。此外,这次实验还让我知道了要在编程中多使用防御性编程,考虑健壮性与正确性,使用日志记录错误,使用EclEmma评估代码覆盖率等。
最后,本次实验还提供了三个程序用来进行debug练习。
可以说这次实验让我学到了很多东西。