陷阱 - 過多或不適當的堆疊跟蹤

程式設計師可以做的更煩人的事情之一是在整個程式碼中分散對 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 中丟擲異常,你可能會在日誌檔案中看到相同堆疊跟蹤的兩個副本,對應於相同的故障。

簡而言之,要麼記錄異常,要麼進一步重新丟擲異常(可能包含另一個異常)。不要兩者都做。