你的問題主要是關於日誌記錄,根據你的需求和應用程序的複雜性,有幾種方法可以做到這一點。明明有例如它們之間的差異:
的System.out.println()使用掃描儀類的的PrintStream出靜態對象打印傳遞的參數到控制檯。 println()是PrintStream類的一種方法。絕對不是一個合適的日誌解決方案。
System.println.out()我不認爲這樣的方法存在於System類中,請參閱documentation。
System.err.println()來確實存在,再次是的PrintStream類的靜態對象。這是標準的錯誤輸出流,它已經打開並且正在等待接收應引起用戶注意的數據。
如果您正在使用控制檯,您將無法看到err.println之間的差值()和通過out.println()。您可以明顯地配置它們,以便err.println()輸出文件中的所有錯誤。
Java的Exception類擴展Throwable的並實現序列化接口。異常繼承的Throwable類的所有下面的方法:
- 的getCause() - 如果原因不存在
- 的getMessage返回的Throwable或空() - 返回此拋出
- 的getStackTrace的細節字符串消息() - 返回的StackTraceElement []中的拋出
- 的printStackTrace()的 - 具有低於
的getStackTrace描述了兩種變型()爲您提供了對堆棧跟蹤的編程訪問。
返回堆棧跟蹤元素數組,每個元素代表一個堆棧 框架。數組的第零個元素(假設數組的長度爲 非零)表示堆棧的頂部,這是序列中最後一個調用方法 。通常,這是創建和拋出此throwable的點。數組 (假設數組長度不爲零)的最後一個元素表示 堆棧的底部,這是序列中第一個方法調用。
的printStackTrace()或的printStackTrace(PrintStream的多個)而不PrintStream的參數的第一個打印標準錯誤輸出流中的堆棧跟蹤(正確的猜測!即err.println())。如果我們希望在文件中打印堆棧跟蹤,我們傳遞指向文件或其他目標的printStackTrace()方法PrintStream。
好吧,現在回到日誌。有幾種日誌框架可以讓您以不同級別的嚴重性記錄數據。例如,你有一個企業應用程序,你想記錄基於
日誌框架可以被用來做很多,下面列出幾個:
- 記錄簡單的文本信息
- 日誌級別來過濾不同的日誌消息
- 日誌類別
- 日誌文件滾動
- 有能力配置的配置文件的CONFIGS要加載
- 巨大list推移
根據您正在開發的應用程序的要求,您可以使用一堆日誌框架:
- 的Log4j
- Java記錄API
- Apache的百科全書API
- 見多here和here
有一些這些日誌框架的基準測試結果,例如見here的比較Log4j,Logback和Java Logging API。
根據您的項目需求,您希望實現的複雜性和日誌記錄級別,您有很多選擇可供選擇。
Exception handling good for testing? No.
Is logging good for testing? No.
異常處理是當您處理意外情況時。例如,你期待整數輸入,然後你得到字符串。如果你不處理這樣的場景,執行會中斷,因此,你編寫try和catch塊來捕獲這些異常,然後警告用戶他/她只應該輸入一個整數。像這樣,有很多異常和異常會導致代碼的執行被暫停。如果用戶能夠停止執行你的代碼,那麼這不是一個好的程序,因此,你需要異常處理來處理任何類型的用戶,輸入數據等。
你不能使用Exception處理測試,但它確實幫助你。怎麼樣?異常處理可以與測試框架一起使用,以幫助您手動拋出不同類型的異常,然後使用異常處理代碼處理異常。
記錄不能用於測試,但它可以用於測試。您可以使用測試框架(如JUnit)使用日誌框架,以運行測試以及記錄執行測試期間發生的所有事件。您可以配置日誌框架以創建特殊的日誌文件集,每次執行測試時。
如果您希望進行日誌記錄並希望在未來成爲程序員(您可能已經是),那麼您肯定需要使用測試框架進行測試,記錄日誌框架以及異常處理來處理異常。
處理程序無法處理的異常的最重要的事情是儘可能多地捕獲信息。否則,必須診斷並修復它的開發人員不會有太多事情要做。 Java使得顯示堆棧跟蹤變得非常簡單。至少打印一個(你的前兩個方法不會)。下一步將添加一些相關的上下文信息(用戶標識,方法參數,調用者狀態等)。 – Thilo
@Thilo感謝您的評論。對於每個閱讀代碼並需要修復代碼的人來說,添加附加信息都非常方便。顯示stracktrace會導致發現錯誤的位置。 – Nina