读书笔记--编写高质量代码 改善java程序的151个建议(八)异常

读书笔记--编写高质量代码:改善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();   

异常只为异常服务

不要用异常来做判断或者区别业务处理逻辑走向。这样做降低了系统性能,降低了代码的可读性,而且还容易隐藏运行期产生的错误。

也不要因为异常性能不高而不使用异常,异常可以让系统更健壮,开发维护更省心,而正确使用异常的性能开销还是可以接收的。

猜你喜欢

转载自blog.csdn.net/qq413041153/article/details/38555967