2

我只是在想Java異常。有許多不同的類型,他們都爲自己的部分工作。我很好奇的是處理它們。例如不同異常報告

try 
{ 
    //Protected code 
}catch(ExceptionName e1) 
{ 
    //Catch block 
} 

在catch blok中有多種報告異常的方法。 我已經發現了幾個,但我相信更多的周圍還有:

  • System.err.println(e1);用於調試
  • system.println.out(e1);只是查看錯誤的本地驗證
  • e1.printStackTrace();只是查看錯誤
  • Logger.getLogger(classname.class.getName()).log(Level.SEVERE, null, e1);其中如果我是正確的,級別可以在調試,信息和錯誤中有所不同。

爲什麼你會選擇一個嗎?我能想到的只是它報道的信息?因此,對於簡短的錯誤,您只需打印異常,並在尋找實際問題時使用更大的東西。如果你知道會有例外,但不認爲這很重要,可以拋出它嗎?

是異常handeling測試代碼的好工具?它可以代替Black-Box-testing嗎?

+1

處理程序無法處理的異常的最重要的事情是儘可能多地捕獲信息。否則,必須診斷並修復它的開發人員不會有太多事情要做。 Java使得顯示堆棧跟蹤變得非常簡單。至少打印一個(你的前兩個方法不會)。下一步將添加一些相關的上下文信息(用戶標識,方法參數,調用者狀態等)。 – Thilo

+0

@Thilo感謝您的評論。對於每個閱讀代碼並需要修復代碼的人來說,添加附加信息都非常方便。顯示stracktrace會導致發現錯誤的位置。 – Nina

回答

1

你的問題主要是關於日誌記錄,根據你的需求和應用程序的複雜性,有幾種方法可以做到這一點。明明有例如它們之間的差異:

的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推移

根據您正在開發的應用程序的要求,您可以使用一堆日誌框架:

  1. 的Log4j
  2. Java記錄API
  3. Apache的百科全書API
  4. 見多herehere

有一些這些日誌框架的基準測試結果,例如見here的比較Log4j,Logback和Java Logging API。

根據您的項目需求,您希望實現的複雜性和日誌記錄級別,您有很多選擇可供選擇。

Exception handling good for testing? No. 
Is logging good for testing? No. 

異常處理是當您處理意外情況時。例如,你期待整數輸入,然後你得到字符串。如果你不處理這樣的場景,執行會中斷,因此,你編寫try和catch塊來捕獲這些異常,然後警告用戶他/她只應該輸入一個整數。像這樣,有很多異常和異常會導致代碼的執行被暫停。如果用戶能夠停止執行你的代碼,那麼這不是一個好的程序,因此,你需要異常處理來處理任何類型的用戶,輸入數據等。

你不能使用Exception處理測試,但它確實幫助你。怎麼樣?異常處理可以與測試框架一起使用,以幫助您手動拋出不同類型的異常,然後使用異常處理代碼處理異常。

記錄不能用於測試,但它可以用於測試。您可以使用測試框架(如JUnit)使用日誌框架,以運行測試以及記錄執行測試期間發生的所有事件。您可以配置日誌框架以創建特殊的日誌文件集,每次執行測試時。

如果您希望進行日誌記錄並希望在未來成爲程序員(您可能已經是),那麼您肯定需要使用測試框架進行測試,記錄日誌框架以及異常處理來處理異常。

+0

感謝您的詳細解釋。它爲我清除了很多。 – Nina

+0

很高興幫助,請仔細閱讀文檔和其他鏈接以獲得更詳細的想法。 – Raf

+1

我在發佈「堆棧」之前嘗試進行研究。大多數時候javadoc都很清晰,但關於這個的文檔只會讓我更加困惑。 – Nina