陷阱 - 过多或不适当的堆栈跟踪

程序员可以做的更烦人的事情之一是在整个代码中分散对 printStackTrace() 的调用。

问题是 printStackTrace() 会将堆栈跟踪写入标准输出。

  • 对于适用于非 Java 程序员的最终用户的应用程序,堆栈跟踪充其量只是无法提供信息,而且最糟糕的是令人担忧。

  • 对于服务器端应用程序,很可能没有人会查看标准输出。

一个更好的想法是不直接调用 printStackTrace,或者如果你确实调用它,以堆栈跟踪写入日志文件或错误文件而不是最终用户控制台的方式执行。

一种方法是使用日志记录框架,并将异常对象作为日志事件的参数传递。但是,即使记录异常,如果做得不明智也可能是有害的。考虑以下:

public void method1() throws SomeException {
    try {
        method2();
        // Do something
    } catch (SomeException ex) {
        Logger.getLogger().warn("Something bad in method1", ex);
        throw ex;
    }
}

public void method2() throws SomeException {
    try {
        // Do something else
    } catch (SomeException ex) {
        Logger.getLogger().warn("Something bad in method2", ex);
        throw ex;
    }
}

如果在 method2 中抛出异常,你可能会在日志文件中看到相同堆栈跟踪的两个副本,对应于相同的故障。

简而言之,要么记录异常,要么进一步重新抛出异常(可能包含另一个异常)。不要两者都做。