摘要:指示該錯誤是否嚴重,此屬性會在該異常根據錯誤的上下文遍歷堆棧時進行更新,嚴重性會指示異常捕獲代碼是應該停止程序還是該繼續處理。引發異常在檢測到錯誤并無法從中恢復時,異常將向上傳播到調用堆棧,直到到達處理它的某個塊。
翻譯:瘋狂的技術宅
原文標題:Exception handling strategy
原文鏈接:http://programmergate.com/exc...
本文首發微信公眾號:充實的腦洞
在本文中,我們介紹了在OOP應用中處理異常的常見策略,這些策略符合最佳的異常處理技術,可以在任何應用中使用。
1. 概述下圖提供了策略概述,它展示了從檢測階段到處理階段的異常處理流程。該圖需要從下往上進行閱讀:
Error detection: 在策略的底部是錯誤檢測,這是發生異常的地方,它要么由程序進行檢測,要么由一些外部調用引發。
Local exception handling: 在第二級是本地異常處理,檢測錯誤的類嘗試在本地處理異常,例如:將請求發送到備份服務器,或等待X秒后再次嘗試等...如果異常無法恢復,則將其傳播到較高級別。
Propagate exception to higher levels: 當本地錯誤處理不起作用時,該類收集診斷信息,再現和報告錯誤所需的所有信息,然后將該異常傳到棧中。 如果檢測到的異常不是低級別依賴(取決于低級別實現),那么它將被拋出,否則將被轉換為自定義異常,以實現組件之間的解耦。
Keep propagating if nothing to do with the exception: 較高級別的類將會繼續將異常傳到棧中, 只要它們與異常無關。同時關閉在傳遞路徑的所有資源(例如文件、網絡連接、釋放分配的緩沖區等),并添加相關的上下文信息, 這將有助于確定錯誤的原因和嚴重性。
Handle exception:在這個階段,異常會到達一個負責處理它的類,異常所攜帶的所有錯誤信息都記錄在此,并且根據異常的嚴重性,該類可以處理異常或者結束程序。
2. 自定義異常模板實現異常處理策略時要做的第一件事就是,為程序的每個組件創建自定義異常,自定義異常如下所示:
public class ComponentException extends Exception { private static final long serialVersionUID = 1L; private int errorCode; private String errorDescription; private boolean isSevere; public ComponentException() { super(); } public ComponentException(Exception ex) { super(ex); } public int getErrorCode() { return errorCode; } public void setErrorCode(int errorCode) { this.errorCode = errorCode; } public String getErrorDescription() { return errorDescription; } public void setErrorDescription(String errorDescription) { this.errorDescription = errorDescription; } public boolean isSevere() { return isSevere; } public void setSevere(boolean isSevere) { this.isSevere = isSevere; } }
以下描述了ComponentException類的屬性:
errorCode:識別此錯誤的唯一代碼,errorCode告訴我們那里出錯了,程序的所有錯誤代碼應在靜態類中進行預定義。該屬性指示異常捕獲代碼應該怎樣處理這個錯誤。
errorDescription: 對錯誤的描述,描述了用戶、程序操作人員和可能的程序開發人員所需的一切必要的細節,可以使他們了解到底發生了什么錯誤。
isSevere: 指示該錯誤是否嚴重,此屬性會在該異常根據錯誤的上下文遍歷堆棧時進行更新,嚴重性會指示異常捕獲代碼是應該停止程序還是該繼續處理。
3.引發異常在檢測到錯誤并無法從中恢復時,異常將向上傳播到調用堆棧,直到到達處理它的某個 try-catch塊。該異常可以按原樣傳遞,也可轉換為自定義異常。
3.1 拋出異常如果異常不依賴于定期更改的低級實現或動態實現,那么你只需關閉打開的資源,并把異常積蓄傳到調用棧而不去捕獲它。下面是一個例子:
public void doSomething() throws SomeException { try{ doSomethingThatCanThrowException(); } finally { //close the opened resources } }3.2 拋出自定義異常
當捕獲的異常取決于低級別或動態實現時,它會被轉換為一個特定的異常,然后重新啟動調用堆棧。 下面是一個例子:
public Student readStudent(String id) throws SomeException { try { // Some code which reads a student from oracle database } catch(SQLException ex) { DataAccessException dataAccessException = new DataAccessException(ex); dataAccessException.setErrorCode(101); // we assume this code denotes student not found dataAccessException.setErrorMessage("An error occurred while reading " + "student with id: " + id + " from database"); dataAccessException.setSeverity(false); throw dataAccessException; } }
只要它還沒有到達能夠處理它的類,異常就會繼續傳播。
P.S:強烈建議在異常傳播到堆棧時更新異常的嚴重性,無論是異常被繼續拋出,還是轉換為自定義異常。
4. 捕獲異常在程序中,你需要捕獲并響應來拋出異常,通常你需要在調用層次的頂部執行此操作。
捕獲異常時首先要做的是記錄它,通常我更喜歡使用printStackTrace(),之后的處理過程取決于異常的嚴重性:
如果嚴重,則通知開發人員和程序操作人員,并且結束程序。
如果不嚴重,則根據錯誤代碼完成處理。通常有兩種可能性,可以靜默地從異常中恢復,或者通知最終用戶并停止當前進程。
下面是一個例子:
try{ startTheWholeThing(); } catch(MyAppException e) { e.printStackTrace(); if(e.isSevere()) { notifyNonUsers(e); // Halt the system gracefully } else { if(e.getErrorCode() == 100) { // do some silent recovery logic } else { notifyUsers(e); } } }
以上是我在程序中處理異常時所遵循的策略,希望你能喜歡。
關注微信公眾號:充實的腦洞, 一個技術宅的保留地 | |
---|---|
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67719.html
摘要:近日,在上列舉了開發中常見的個錯誤,與君共免。在多線程中并發修改集合內容是非常常見的,因此需要使用并發編程中常用的方法進行處理,例如同步鎖對于并發修改采用特殊的集合等等。在單線程和多線程情況下解決這個問題有微小的差別。 在編程時,開發者經常會遭遇各式各樣莫名錯誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開發中常見的 5 個錯誤,與君共「免」。 原文...
摘要:生產者消費者問題是一個典型的多進程同步問題。生產者線程開始產生新的元素并將它們存儲在緩沖區。否則,生產者線程將會在緩沖區創建一個新元素然后通知消費者。我們建立一個線程池,它將收到兩個任務,生產者和消費者的任務。 原文鏈接:https://dzone.com/articles/th... 作者:Ioan Tinca 譯者:liumapp 想要了解更多關于Java生產者消費者問題的演變嗎?...
摘要:能否聲明一個內容為空的接口可以。能否將接口聲明為不允許,這樣做會導致編譯錯誤。當異常沒有被捕獲時,會發生什么當前線程所在的線程組會執行一個叫的方法,最后程序會異常退出。非靜態內部類可以使用哪些修飾符非靜態內部類可以使用或修飾符。 原文地址 http://www.instanceofjava.com/2014/12/core-java-interview-questions.html 1...
摘要:我們應該考慮使用字符串常量調用方法來代替使用對象調用該方法。然而如果我們通過字符串常量來調用方法,執行流程會正常進行檢查方法的參數在執行方法的方法體之前,務必對方法的參數進行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...
摘要:每個消費者會得到平均數量的。為了確保不會丟失,采用確認機制。如果中斷退出了關閉了,關閉了,或是連接丟失了而沒有發送,會認為該消息沒有完整的執行,會將該消息重新入隊。該消息會被發送給其他的。當消費者中斷退出,會重新分派。 Work模式 原文地址showImg(https://segmentfault.com/img/bVbqlXr?w=694&h=252); 在第一章中,我們寫了通過一個...
閱讀 591·2021-11-22 14:45
閱讀 3083·2021-10-15 09:41
閱讀 1579·2021-10-11 10:58
閱讀 2806·2021-09-04 16:45
閱讀 2617·2021-09-03 10:45
閱讀 3247·2019-08-30 15:53
閱讀 1231·2019-08-29 12:28
閱讀 2143·2019-08-29 12:14