2015-11-07 135 views
0

快速問題。當然,堆棧跟蹤提供了更多信息,但是在某些情況下使用異常本身是不好的做法?就像剛剛得到「空指針異常」而不是這個巨大的垃圾堆棧?如果這沒有任何意義,這兩個區別將是:打印堆棧跟蹤與異常本身

(Exception e) 
{ 
    print e 
} 

AND 

(Exception e) 
{ 
    e.printStackTrace 
} 
+1

不知道你在問什麼。 – djechlin

+1

如果你不想堆棧跟蹤,然後打印'e.getMessage()' – Blip

回答

1

它們之間的區別在於printe返回異常和錯誤消息的類型,而printStackTrace返回異常的整個堆棧跟蹤。 printStackTrace更有利於在調試時使用。

例子:

打印E:

java.lang.IndexOutOfBoundsException 

e.printStackTrace():

java.lang.IndexOutOfBoundsException: Index: 8, Size: 0 
    at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
    at java.util.ArrayList.get(ArrayList.java:322) 
    at com.o2.business.util.Trial.test(CommonUtilsTest.java:866) 

的printStackTrace可能是很好的程序員,但它不是可讀的和用戶友好的終端用戶。據我所知,printStackTrace將結果打印在默認的Errorstream中:您的控制檯。爲了更好的實踐,您可以檢查鏈接:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

+0

謝謝你的例子,Eray! – trevalexandro

6

我會說在生產中都不使用它們。您應該以其他方式處理異常,例如記錄異常或將堆棧跟蹤保存到某處以便稍後查看,並可能向用戶顯示一條好消息,說明該應用或方法失敗。

但如果你只是問這這些方法的使用,我會說後者更好,因爲System.out.println(e)將調用Throwable#toString只提供此異常的消息,也許你不會得到這個問題的真正原因。

+0

謝謝你Luiggi! – trevalexandro

2

這取決於上下文。任何將(或甚至可能意外地)呈現給用戶的應該包括堆棧跟蹤的應該是而不是。不僅讓人困惑,還可能泄露潛在的敏感信息。

在我的代碼中,我創建了具有UserFriendlyMessage屬性的自定義異常。友好的信息應該是非常簡單的英文。我甚至有一個默認的全部友好信息「出現了一個意想不到的問題。您可以再試一次,如果問題仍然存在,請聯繫支持部門」

另一方面,,具有堆棧跟蹤是非常寶貴的調試。在我的.NET應用程序中,我們甚至用特殊的方式編譯我們的發佈代碼,以便代碼得到優化,但符號仍然在單獨的文件中生成。我們這樣做的唯一目的是確保使用行號完整堆棧跟蹤。

因此,在總結,顯示只有友好的信息,但日誌(如果你要,警報)完整的堆棧跟蹤+友好的消息。