簡體   English   中英

在Java應用程序中處理異常

[英]Handling exceptions in Java application

在處理數據庫的程序包中引發異常時,在處理UI的程序包中引發異常時,應該拋出相同的異常還是創建另一個異常?

UI程序包應該知道我處理數據庫的程序包的異常嗎?

作為程序員,我們希望編寫解決問題的高質量代碼。 不幸的是,異常是我們代碼的副作用。 沒有人喜歡副作用,因此我們很快找到了解決它們的自己的方法。 我已經看到一些聰明的程序員通過以下方式處理異常:

public void consumeAndForgetAllExceptions(){
    try {
        ...some code that throws exceptions
    } catch (Exception ex){
        ex.printStacktrace();
    }
}

上面的代碼有什么問題?

引發異常后,將暫停正常程序執行,並將控制權轉移到catch塊。 catch塊捕獲異常並抑制它。 在catch塊之后繼續執行程序,好像什么也沒發生。

接下來呢?

 public void someMethod() throws Exception{
 }

這種方法是空白的。 它沒有任何代碼。 空白方法如何引發異常? Java不會阻止您執行此操作。 最近,我遇到了類似的代碼,在該代碼中聲明了該方法引發異常,但是實際上沒有代碼生成該異常。 當我問程序員時,他回答說:“我知道,它正在破壞API,但是我已經習慣了它並且可以工作。”

請訪問這里了解更多詳情。

為了使各層緊密耦合,我建議對Exception進行抽象(如果沒有合適的標准異常)。 抽象是指您可以將與數據庫相關的異常(如SQLException包裝到PersistenceException或sth中。 像那樣。 這樣,您可以輕松更改圖層,而不必擔心更改以上圖層的代碼。 然后,僅應在可以處理異常的情況下捕獲並處理異常,例如,將異常傳播到GUI中的用戶。 否則,您應該將它們扔給下一個呼叫者,直到更高級別處理它為止。 您應該避免在重新創建新異常時重新創建它們,在大多數情況下,這些新異常不會添加任何信息。

您應該拋出一個有意義的異常。 更重要的是,您不應引發沒有異常的異常。 異常表示您無法輕易恢復的錯誤狀態,這意味着,如果您具有處理丟失文件之類的代碼,則不應拋出異常。 僅應在發生意外情況時引發異常。

當異常在您的堆棧中傳播時,應根據捕獲的代碼的哪一部分對其進行多樣化。

例如,您的持久性框架可能會拋出SqlException,DAO層可能會將其重新拋出為IllegalArgumentExection或ObjectNotFoundEception,服務層可能會拋出MalformedRequestException,AccessDeniedException或DeviceNotEnrolledException。 最后,您的UI可以以多種有意義的方式向用戶顯示此內容。

我建議將異常放在最相關的位置。 您應該在不同類型的情況下使用不同的異常來處理代碼。 UI將具有與數據庫不同的異常類型。

在可能的情況下使用預定義的異常,您也可以創建自己的異常,並在需要時將其放入兩個程序包中。

對代碼進行設計,以便可以以一種易於在邏輯上定位catch語句的方式來處理代碼,並且catch語句可以處理該代碼,並且可以在傳遞到層次結構后進行某種恢復。

我們最關心的情況類型是檢查異常。 這些是我們可以預見並捕獲並試圖恢復的問題。 確保您沒有使用太多這些! 它們浪費資源!

暫無
暫無

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

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