(软件构造02)异常处理总结

软件构造课程实验四针对异常处理方面做了比较细致的要求,现在对异常处理做一下总结。
异常处理:
异常:程序执行中的非正常事件,程序无法再按预想的流程执行将错误信息传递给上层调用者,并报告“案发现场”的信息
return之外的第二种退出途径。
异常的种类:
运行时异常:由程序员在代码里处理不当造成程序源代码中引入的故障所造成的 ;例如:rrayIndexOutOfBoundsException, NullPointerException。
如果在代码中提前进行验证,这些故障就可以避免
其他异常:由外部原因造成程序员无法完全控制的外在问题所导致的;例如:FIleNotFoundException。即使在代码中提前加以验证(文件是否存在),也无法完全避免失效发生。实验四的第一部分在处理文件读入并解析的各种情况做了详细的要求。下图是实验四中自己定义的异常类。(软件构造02)异常处理总结_第1张图片
Java 中的异常处理都是围绕着 try-catch-finally, throw, throws 这几个展开的,也就是:
try-catch-finally:捕获异常并处理。
throw:遇到错误的时候抛出一个异常。
throws:声明一个方法可能抛出的异常(所有可能抛出的异常都需要声明)。
在 Java 中的异常分为 checked exceptionunchecked exception。 java.lang.RuntimeException 和 java.lang.Error 类及其子类是 unchecked exception,其余的就是 checked exception 了。当你在进行 API 设计时,必须要了解到异常声明也是 API 的一部分。如果你为你公开的 API 声明了可能抛出的异常,在今后很长的一段时间里你可能都甩不掉它们了。以后你要重构或进一步开发这些 API 时,不得不考虑这些异常带来的向后兼容性问题。因为,如果你在日后的版本中删除了某个异常的声明,就会造成之前用户的代码无法通过编译。仔细考虑你要声明抛出的异常。
异常处理的难点主要是在对于什么时候处理异常的理解上。在不同的层级上,你要考虑这个异常是不是应该在这个层级上进行处理,还是说应该继续向上抛出,甚至某些情况下还需要包装捕获到的异常,再向上抛出。不同抽象层级上的代码应该只声明抛出同一层级上的异常。在具体处理异常的地方,应当使 try-catch 块尽可能的小,catch 尽可能具体的异常。千万不要 catch Exception 这么宽泛的异常之后就不管了。尝试把 try-catch 作为程序流程控制的一部分。
比如:
String parm;
try {
param = jsonObj.getString(“parm”);
} catch (JSONException e) {
e.printStackTrace();
param = “default value”; // 设置一个默认值。
}
如果你需要自己创建异常,请将对异常的设计放在与程序设计同样的地位。有的开发者可能会用一个大而全的异常类来表示各种不同类型的错误,只用错误信息来区分不同的错误。这种异常处理方式一方面是不够优雅,另一方面是当你需要进行 exception translation 时很难对这种大而全的异常进行再包装。
你应该仔细设计异常的层次结构,根据不同的抽象定义不同的异常类,并在异常类中包含尽量丰富的信息。对于异常提供的信息来说,是程序的内部错误,要和展示给用户的错误提示区分开来。因此,程序需要保证在和用户交互的层次上,捕获所有的异常,并生成相应的面向用户的错误提示。

你可能感兴趣的:((软件构造02)异常处理总结)