HIT软件构造第六章一二节知识点总结

  第六章的内容为面向健壮性的编程。涉及到的内容很多,完全不仅是所谓的“那我只要对每种情况都好好考虑就行了”这种想法和追求就能完善的。因此就来依次讲解相关内容。

一.健壮性与正确性

1.健壮性与正确性的定义

  两者之间的区别和共性等内容已经在1.2节中详细的介绍过了。
  一般在UI和外部接口等等,我们尽可能追求健壮性,而在内部的实现逻辑和算法等等,我们尽可能追求正确性。也就是说,对内追求正确性,对外追求健壮性,并且内外进行隔离,内部的问题内部解决。
  软件的类型也影响追求的方向,例如航空航天我们更应追求正确性,消费性软件更应追求健壮性。
  这两个合在一起我们统称为可靠性,是两者的综合度量。

2.健壮性与正确性的测量

  我们分别可以从外部角度和内部角度去衡量。
  对于外部角度,我们有两个指标。
  (1).MTBF:平均故障间隔时间(平均无故障运行时间),是指相邻两次故障之间的平均工作时间。故障都是说系统无法解决以至于程序不可使用。计算方法很简单,就是用总时间除以故障的次数。
  (2).MTTF:平均故障间隔时间,是指失效或维护中所需要的平均时间,包括故障时间以及检测和维护设备的时间。也就是这项指标反应了修复故障的效率。
  对于内部角度,就是我们之前也提到过的,每千行代码存在多少个bug(虽然哪里都没有说明到底怎么才能检测这项指标…)

二.错误与异常处理

1.java中的错误与异常处理

  下图为java中对错误(error)和异常(exception)的分类。其中蓝色的部分为代码中不用显示的去处理的部分,而绿色的部分,是一旦有可能发生异常,那我们必须要用对应的语句去处理,否则编译过不去。
在这里插入图片描述
  error:内部的错误,与程序无关,虽然发生的概率很低,但是一旦发生我们就无能为力,只能以尽量优雅的方式终止程序。因此,我们也不需要对这些进行处理。
  exception:程序的问题,被称为异常,我们可以通过捕获和完善等等来将其解决。

2.异常处理

(1).异常的类型

  异常是导致程序不再按照预想的流程执行的事件,我们就可以根据异常来进行操作,在程序中对其进行处理,可以选择继续进行而不是直接程序退出,从而提高健壮性。
  编译器只会对除了RuntimeException及其子类的异常进行检查,相应的异常也被成为checked的异常。因为error不需要检查,出现了问题就无解;而RuntimeException一般都是程序员在代码中处理不当造成的,因此编译器也不强制检查。
  当我们在程序中自定义一个异常时该如何对它进行分类呢?由于ckecked异常一般是可能出现且编译器应该处理的情况,因此如果这个异常可以通过其他方法来恢复,我们就应该把它设置成一个checked的异常;而相反,unchecked的异常就是指程序自身的问题,那出现了就应该退出而不是继续运行,因此这个异常如果不能恢复,那就更推荐设置成unckecked的异常。
  但由于unckecked的异常不用显式的处理,因此要想让代码更加易读,倾向于用unchecked exception来处理程序中的错误。其实具体选择并不需要十分死板
  总之总结如下图所示,确实它们之间的区别比较折腾。
在这里插入图片描述

(2).异常的抛出

  当我们的方法的实现中创造了新的异常,或者方法中调用的方法规定要让上一层的方法去处理它抛出的异常(有点类似于递归定义,一层一层的抛出),而我们既不想自己处理,又希望上层调用的人不能忽视而去处理,那就可以对该方法的后面加入throws关键字,抛出异常(当然这个异常可以接龙似的从最底层抛出到最上层);可见这种异常应该是checked异常。因此,规约中也是要不可避免地说明此方法抛出异常的情况,告诉上层的调用者要去做处理。
在这里插入图片描述
  由于LSP原则,子类抛出的异常应该是父类抛出的异常的子类或相同,否则子类对象无法被当成一个父类对象,从而违反了LSP原则。
  上述是声明方法中会抛出异常,但具体的抛出,要依赖于内部的throw语句,throw一个对应异常类型的新的对象。也就是说,内部出现了throw(即没有处理),那方法就必须要加入trhows关键字说明里面throw了对应的异常。
  当异常被发现并抛出的时候,就会不断回到上层,直到运行try catch语句中catch语句中的部分;因此控制权不会再返回,方法中剩余的内容不会再进行。

(3).创建新的异常类

  当JDK提供的异常不足以描述我们程序中可能出现的异常时,才推荐创建新的异常类,创建的新的异常类要求必须是Exception的子类。一般来说,覆写的方法中父类的方法就足够了,毕竟其实我们重要的就是分个类,具体怎么操作在try catch中处理就完事了。

(4).异常的捕获与处理

  java中使用try catch finally来进行对异常的处理。同样,在try中发现了异常,则try语句块后面的内容不会再被执行,而是转到catch执行。
  如果一个try对应多个catch语句,也只有最多一个catch中的内容被执行,也就是一旦进入了一个catch块,那其他语句块也浪费了。
  finally语句中的内容无论如何都会被执行,即使出现了新异常还是正常运行还是捕获了异常。因此常用于释放或关闭文件等无论如何都要进行的操作操作。
  trace stack:越上层越接近案发现场,最下面是出现异常的最底端,不断抛出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值