在我们实际的软件构造实例当中,我们往往会因为各种各样的原因出现错误,或是因为外部输入的错误,或是因为内部代码的失误造成各种各样的问题,通常我们有异常处理机制和断言机制来处理这些问题。在处理的过程中,我们往往需要从健壮性和正确性两方面来进行考量
异常处理机制
健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度
异常处理机制依靠try-catch-finally语句往往能够很好地在异常处理的情况下进行很好地提高健壮性。注意这里的异常通常是cheked exception
即在错误的输出后能够进行一定的处理的情况。通常在程序中,我们可以通过throw抛出异常。
throw new timeFormatException(name+":"+da+"航班时间信息不一致");
同时可以通过在方法中声明throws将异常抛给上层去处理。
public static void readFile(String strFile,FlightCollection Flightschedule) throws Exception {
logger.planeLogger().info("读文件");
BufferedReader br = new BufferedReader(new FileReader(strFile));
boolean flag=true;
Pattern pattern = Pattern.compile("Flight:(.*?),([A-Z]{2})(.*?)\n\\{\nDepartureAirport:(.*?)\nArrivalAirport:(.*?)\nDepatureTime:(.*?)\nArrivalTime:(.*?)\nPlane:(.*?)\n\\{\nType:(.*?)\nSeats:(.*?)\nAge:(.*?)\n\\}\n\\}\n");
String stringInfo = "";
while(flag) {
String myLine;
for(int i=0;i<13&&flag;i++) //每13行一个周期读取字符串
{
if((myLine = br.readLine()) == null)
flag = false;
stringInfo = stringInfo + myLine + "\n";
}
当try-catch捕获注某个异常之后,例如用户输入错误的参数,会进行一定地应对,例如,我将信息返回给用户,并让他重新执行这个操作。而不是直接粗暴地结束这个程序,这样就增加了函数的健壮性。
断言机制
首先断言机制在默认情况下是关闭的,所以我们得先去进行人工的开关。然后对于断言机制,讲究绝对的正确性,例如我们每个ADT当中为检查RI所写的checkrep()中就经常使用了断言机制
private final String sta;
//AF:sta为状态名
Safety from rep exposure:
//以private 定义的变量类型,防御性编程
public Blocked() {
this.sta="blocked";
checkRep();
}
private void checkRep() {
assert sta.equals("blocked");
}
断言机制往往用来检查内部的正确性,因为外部出现错误的情况时有发生,如果每次都直接结束程序,对于客户端太不友好,大大降低了健壮性,而如果某个方法满足了pre-condition。那么一定在代码内部正确执行就会得到正确的post-condition,这个时候就可以用断言机制验证程序的正确性
总结
异常处理机制更倾向于提高程序的健壮性,而断言机制则倾向于验证程序的正确性,但在处理问题的角度上,断言能处理的问题异常处理机制同样也能处理,反之亦然。值得注意的是断言往往会耗费大量性能,所以往往在程序发布前通过断言确定程序正确性,而在发布之后注释掉断言以保证性能