软构复习4

正确性和健壮性

健壮编程原则:封闭实现细节;考虑极端情况;

健壮性:尽可能使程序运行而不是退出

健壮性:

让用户变得更容易:出错也可以容忍,程序内部已有容错机制

正确性:

让开发者变得更容易:用户输入错误,直接结束。

(不满足precondition的调用)

Error:一旦出现程序员无能为力,只能想办法让程序优雅的结束

Eg.用户输入错误、设备错误、物理限制

异常:程序自己的问题,可以捕获,可以处理

可以上抛,将错误信息传递给上层调用者,

异常可分为:

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

其他异常:外部原因

运行时的异常:运行时才会出现的异常;如数组下标越界,空指针,类型转换异常,非法参数。一般是由程序逻辑错误导致的,可以通过捕获处理或向上抛出。特点是,java编译器不会检查他,也就是说,当程序可能出现运行异常时,也能编译通过。但如果在代码中提前验证,运行时异常是可以避免的。

编译异常:文件找不到,类找不到,方法找不到。是程序编译时会出现的异常,必须进行处理,如果不处理,程序就不能编译通过。这种异常就算提前验证也不能完全避免。

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

Checked Exception

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

每个调用者都应该知道和处理的错误,必须捕获或传播,否则程序将无法编译(编译器检查是否为所有检查的异常提供异常处理程序)。类似于静态类型检查。

Unchecked Exception

错误表示发生在应用程序之外的条件,如系统崩溃。运行时异常通常由应用程序逻辑中的故障发生。

在这些情况下,你不能做任何事情,但必须重写你的程序代码。所以这些不会被编译器检查。这些运行时异常将在开发和测试过程中被发现。然后,我们必须重新配置我们的代码,以删除这些错误。

不需要在编译时用try...catch等机制处理,可以不处理,编译没问题,但执行时出现就导致程序失败,代表程序中的潜在bug。类似于动态类型检查。

 

异常处理操作

try{

编写可能会出现异常的代码

}catch(异常类型 e){

处理异常的代码

//记录日志/打印异常信息/继续抛出异常

}

finally:无论异常是否产生,都需要执行的代码。

throw:抛出异常 格式:throw new 异常类名(参数);throw关键字使用在方法内,可以抛出指定的异常对象,方式如下:创建一个异常对象。封装一些提示信息(信息可以自己编写)。代码出现异常时,该异常对象将会自动传递到调用者处,同时结束当前方法的执行。

throws:声明异常

声明异常:声明一个异常,并告知调用者。关键字throws运用于方法声明上,表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(捕获处理或者继续抛出)

如果方法内部throw一个编译异常,而没有捕获处理,那么必须在方法体上通过throws进行声明,让调用者处理。

checked就是必须要处理的异常,一般发生于一些特殊情况没有考虑,可以try catch或者throws声明然后抛出

unchecked异常一部分是由开发者自身程序出错,Runtime Exception,一部分是别的,这些异常如果不处理也能成功编译

Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做

 

 

可以处理的就是checked异常,若没有办法就是Unchecked

 

 

throws checked 异常

 

程序员必须在方法的spec中明确写清本方法会抛出的所有checked exception,以便于调用该方法的client加以处理

unchecked异常不能出现在spec

 

这些被throws的异常,要么是本方法检测到的,是自己造出的;要么是本方法调用的其他函数抛出的,是从其他函数传来的异常。

此时需要告知你的client需要处理这些异常;如果没有handler来处理被抛出的checked exception,程序就终止执行

 

 

构造自己的异常类

捕获异常:

尽量在自己这里处理,实在不行就往上传,也可以不处理,直接传给调用方,由客户端处理

如果父类型中的方法没有抛出异常,那么子类型中的方法必须捕获所有的checked exception;子类型方法中不能抛出比父类型方法更多的异常!

 

 

 

断言:fail fast 的一种

异常:预料到可能会发生的不正常情况

断言:处理绝对不应该发生的情况

出现AssertionError,意味着内部某些假设被违反了

断言仅出现在开发阶段,实际运行阶段不再使用断言

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

断言一旦false,程序就停止执行

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

 

 

防御式编程

来自外部的数据源要仔细检查;输入参数的合法性也要检查,并决定如何处理非法输入

posted @ 2023-05-25 18:21  dfhkjsbc  阅读(29)  评论(0)    收藏  举报