快速問題。當然,堆棧跟蹤提供了更多信息,但是在某些情況下使用異常本身是不好的做法?就像剛剛得到「空指針異常」而不是這個巨大的垃圾堆棧?如果這沒有任何意義,這兩個區別將是:打印堆棧跟蹤與異常本身
(Exception e)
{
print e
}
AND
(Exception e)
{
e.printStackTrace
}
快速問題。當然,堆棧跟蹤提供了更多信息,但是在某些情況下使用異常本身是不好的做法?就像剛剛得到「空指針異常」而不是這個巨大的垃圾堆棧?如果這沒有任何意義,這兩個區別將是:打印堆棧跟蹤與異常本身
(Exception e)
{
print e
}
AND
(Exception e)
{
e.printStackTrace
}
它們之間的區別在於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
謝謝你的例子,Eray! – trevalexandro
我會說在生產中都不使用它們。您應該以其他方式處理異常,例如記錄異常或將堆棧跟蹤保存到某處以便稍後查看,並可能向用戶顯示一條好消息,說明該應用或方法失敗。
但如果你只是問這這些方法的使用,我會說後者更好,因爲System.out.println(e)
將調用Throwable#toString
只提供此異常的消息,也許你不會得到這個問題的真正原因。
謝謝你Luiggi! – trevalexandro
這取決於上下文。任何將(或甚至可能意外地)呈現給用戶的應該包括堆棧跟蹤的應該是而不是。不僅讓人困惑,還可能泄露潛在的敏感信息。
在我的代碼中,我創建了具有UserFriendlyMessage屬性的自定義異常。友好的信息應該是非常簡單的英文。我甚至有一個默認的全部友好信息「出現了一個意想不到的問題。您可以再試一次,如果問題仍然存在,請聯繫支持部門」。
另一方面,,具有堆棧跟蹤是非常寶貴的調試。在我的.NET應用程序中,我們甚至用特殊的方式編譯我們的發佈代碼,以便代碼得到優化,但符號仍然在單獨的文件中生成。我們這樣做的唯一目的是確保使用行號完整堆棧跟蹤。
因此,在總結,顯示只有友好的信息,但日誌(如果你要,警報)完整的堆棧跟蹤+友好的消息。
不知道你在問什麼。 – djechlin
如果你不想堆棧跟蹤,然後打印'e.getMessage()' – Blip