簡體   English   中英

如何在Eclipse中顯示完整的堆棧跟蹤?

[英]How to show full stack trace on eclipse?

我正在使用Eclipse調試Java應用程序。 在代碼中的某個地方,我得到了異常和堆棧跟蹤:

Caused by: java.io.EOFException: The connection has been reset while reading the header
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.fetchHeader(Message.java:583)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:599)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:542)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1029)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:158)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363)
    at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229)
    at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108)
    ... 11 more

如何獲得整個堆棧而不是其他... 11 more

擁有整個堆棧。

這只是堆棧跟蹤的一部分。 緊接在此之前是另外一塊。 查看這一行的底線和上一行的頂線。 您會看到它們匹配。 堆棧跟蹤的開頭不是以“ Caused by”開頭的部分。

“由...引起”異常將堆棧跟蹤的某些部分隱藏為其父堆棧中堆棧跟蹤條目的逐字副本。 換句話說,Java不會針對每種原因在main()之前顯示整個堆棧-它只是顯示您尚未看到的內容。 請參閱Throwable.printStackTrace()文檔

在創建Throwable時提供原因時,將填寫“ Causeed by”。 查看它的構造函數。 當一段代碼捕獲到一個低級別的異常,然后又想將其作為另一個異常類重新拋出時,便可以完成此操作。

上面的答案並不准確,每次堆棧顯示單詞“ caused by”時,都意味着該異常經過一種或多種方法,直到被捕獲,然后再次引發。 這可能會發生很多很多次,堆棧跟蹤不是一個循環,而是一個方向,所以不,頂部的內容與底部的內容無關,最重要的部分是底部的內容,是異常的根源,因此如果您有:

類main中的異常:等等等等...代碼行...由FileNotFoundException引起...代碼行...由...引起:MalformedURLException ...代碼行...由...引起:NullPointerException

那么您將不希望過多地關注FileNotFoundException,而是希望更多地關注NullPointerException。 就像說您有一個屬性文件,其中包含文件名。 如果不小心使用了mykey來查找屬性“ myKey”,則propertiesResource將返回null,然后將其拋出所有代碼行(一直希望)一直到最后一個catch塊所在的應用程序。 在這種情況下,它不是作為nullException而是作為FileNotFoundException被“包裝”。

在此處輸入圖片說明

我們可能與他面臨的實際問題有所分歧。 我遇到了類似的問題,原來我的Limit console輸出框已選中。 刪除它后,我可以看到完整的堆棧跟蹤。 步驟:右鍵單擊控制台||。 Ctrl +單擊,如果Mac轉到偏好設置並按照上述說明進行操作

我認為這意味着在printStackTrace之前,該Exception已被捕獲並打包到另外11次中。

嘗試找出以下程序的輸出以更好地理解:

public class PrintStackTrace {

    public static void main(String[] args) {
        try {
            level1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            level2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    static void level2() throws Exception {
        try {
            level1();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void level1() throws Exception {
        try {
            throwingMethod();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void throwingMethod() throws Exception {
        throw new Exception("throwingMethod");
    }

}

正如Ed所言,它顯示的是整個堆棧,但是遺漏了您已經看到的信息。 請參閱Throwable#printStackTrace()

從那里報價:

請注意是否存在包含字符“ ...”的行。 這些行表明,此異常的堆棧跟蹤的其余部分與由該異常(“封閉”異常)引起的異常的堆棧跟蹤的底部指示的幀數匹配。 這種簡寫可以大大減少輸出的長度,在通常情況下,捕獲異常是通過與捕獲“引起性異常”相同的方法引發的:

通常會包裝一個例外; 創建的另一個異常是原因:

try {
    // something which causes an Exception
} catch (Exception e) {
    throw new SpecificException("help", e);
}

在這種情況下,顯示stacktrace將創建您看到的... 11。

我從未見過,但是嘗試一下

public void problemFunction(){
  try{
      //your code
  catch(Exception ex){
     ex.printStackTrace();
  }
}

要么

public void problemFunction(){
  try{
      //your code
     }
  catch(Exception ex){
     System.out.println(ex);
     StackTraceElement[] arr = ex.getStackTrace();
     for(int i=0; i<arr.length; i++){
       System.out.println(arr[i].toString());
     }
  }
}

有一個vmargs選項

 -XX:-OmitStackTraceInFastThrow

在某些情況下可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM