读书笔记--编写高质量代码:改善java程序的151个建议(八)异常
这个异常内容不多,简单总结一下就好了
提倡异常封装
异常封装可以提高系统的友好性,和可维护性,封装后给用户提供的异常信息更友好,然后给代码维护人员更容易阅读。
受检异常尽可能的转化为非受检异常
受检异常使接口声明变得很脆弱,代码可读性降低,还增加了开发工作量,但是在受检异常威胁到系统的安全性、稳定性、可靠性、正确性时,不能转换为非受检异常
不要在finally块中处理返回值
finally可能引起覆盖try中的返回值和屏蔽异常等问题。
不要在构造函数中抛出异常
使用Throwable获得栈信息
AOP编程可以很轻松的控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程只能控制到方法级别,不能实现代码级别的植入,比如一个方法被类A的m1方法调用时返回1,在类B的m2方法调用时返回0,着就要求被调用者据有识别调用这的能力。在这话总情况下,可以使用Throwable来获得栈信息,来鉴别调用者:
public class Client {
public static void main(String[] args) {
Invoker.m1();
Invoker.m2();
}
}
class Foo {
public static boolean m() {
// 取得当前栈信息
StackTraceElement[] sts = new Throwable().getStackTrace();
// 检查是否是m1方法调用
for (StackTraceElement st : sts) {
if (st.getMethodName().equals("m1")) {
return true;
}
}
return false;
}
}
class Invoker {
// 该方法打印出true
public static void m1() {
System.out.println(Foo.m());
}
// 该方法打印出false
public static void m2() {
System.out.println(Foo.m());
}
}
在JDK1.4中,可以这样写:
StackTraceElement[] stackTraceElements = new Throwable().getStackTrace();
然后就可以获取到类名、方法名、行数、文件名等信息:
- stackTraceElements.getClassName()
- stackTraceElements.getFileName()
- stackTraceElements.getLineNumber()
- stackTraceElements.getMethodName()
在JDK1.5中,可以使用:
StackTraceElement[] stackTraceElements = Thread.getStackTrace();
异常只为异常服务
不要用异常来做判断或者区别业务处理逻辑走向。这样做降低了系统性能,降低了代码的可读性,而且还容易隐藏运行期产生的错误。
也不要因为异常性能不高而不使用异常,异常可以让系统更健壮,开发维护更省心,而正确使用异常的性能开销还是可以接收的。