Atitit 異常的實現原理 與用戶業務異常
1.1. 異常的實現原理1
1.2. 用戶業務異常1
1.3. 異常轉譯和異常鏈2
1.4. 避免異常2
1.5. 異常恢復3
1.6. catch代碼塊中捕獲異常處理流程3
方法調用棧(method invocation stack)來跟蹤每個線程中一系列的方法調用過程。該堆棧保存了每個調用方法的本地信息(比如方法的局部變量)。每個線程都有一個獨立的方法調用棧。對於Java應用程序的主線程,堆棧底部是程序的入口方法main()。當一個新方法被調用時,Java虛擬機把描述該方法的棧結構置入棧頂,位於棧頂的方法為正在執行的方法。
當一個方法正常執行完畢,Java虛擬機會從調用棧中彈出該方法的棧結構,然後繼續處理前一個方法。如果在執行方法的過程中拋出異常,則Java虛擬機必須找到能捕獲該異常的catch代碼塊。它首先查看當前方法是否存在這樣的catch代碼塊,如果存在,那麼就執行該catch代碼塊;否則,Java虛擬機會從調用棧中彈出該方法的棧結構,繼續到前一個方法中查找合適的catch代碼塊。在回溯過程中,如果Java虛擬機在某個方法中找到了處理該異常的代碼塊,則該方法的棧結構將成為棧頂元素,程序流程將轉到該方法的異常處理代碼部分繼續執行。當Java虛擬機追溯到調用棧的底部的方法時,如果仍然沒有找到處理該異常的代碼塊,按以下步驟處理。
(1)調用異常對象的printStackTrace()方法,打印來自方法調用棧的異常信息。
(2)如果該線程不是主線程,那麼終止這個線程,其他線程繼續正常運行。如果該線程是主線程(即方法調用棧的底部為main()方法),那麼整個應用程序被終止。
用戶系統
Pwd_or_uname_err
User_already_exist
賬戶系統
Amount_not_ennagh
在分層的軟件結構中,會存在自上而下的依賴關系,也就是說上層的子系統會訪問下層系統的API。當位於上層的子系統不需要關系來自底層的異常的細節時,常見的做法是捕獲原始的異常,把它轉換為一個新的不同類型的異常,再拋出新的異常,把它轉換為一個新的不同類型的異常,再拋出新的異常,這種處理異常的方法稱為異常轉譯。
從面向對象的角度來理解,異常轉譯使得異常類型與拋出異常的對象的類型位於相同的抽象層。例如:車子運行時會出現故障異常,而職工開車上班會出現遲到異常,車子的故障異常是導致職工的遲到異常的原因,如果員工直接拋出車子的故障異常,意味著車子故障是發生在職工身上的,這顯然是不合理的,正確的做法是,將在職工類裡發生的車子異常轉譯為遲到異常。
應該盡可能地避免異常,尤其是運行時運行時異常。避免異常通常有兩種辦法:
(1)許多運行時異常是由於程序代碼中的錯誤引起的,只要修改了程序代碼的錯誤,或者改進了程序的實現方法,就能避免這種錯誤。
(2)提供狀態測試方法。有些異常是由於當對象處於某種狀態時,不合適某種操作而造成的。例如當高壓鍋內的水蒸氣的壓力很大,突然打開鍋蓋,會導致爆炸。為了避免這類事故,高壓鍋應該提供狀態測試功能,讓使用者在打開鍋蓋前,能夠判斷鍋內的高壓蒸汽是否排放完。在程序上,調用某個方法,可以先用狀態測試功能來測試一下,滿足條件才調用它,避免出現異常。
保持異常的原子性有以下辦法。
(1)最常見的辦法是先檢查方法的參數是否有效確保當異常發生時還沒有改變對象的初始狀態(也就是異常發生之前,檢查好各個條件,確保異常不會發生才開始改變對象的狀態)。
(2)編寫一段恢復代碼,由它來解釋操作過程中發生的失敗,並且使對象狀態回滾到初始狀態。這種辦法不是很常用,主要用於永久性的數據結構,比如數據庫的事務回滾機制就采取了這種辦法。
(3)在對象的臨時拷貝上進行操作,當操作成功後,把臨時拷貝中的內容復制到原來的對象的對象中。
只要異常發生,就意味著某些地方出了問題,catch代碼塊既然捕獲了這種異常,就應該提供處理異常的措施,比如:
(1)處理異常。針對該異常采取一些行動,比如彌補異常造成的損失或者給出警告信息等。
(2)重新拋出異常。catch代碼塊在分析了異常之後,認為自己不能處理它,重新拋出異常。
(3)進行異常轉譯。把原始異常包裝為適合於當前抽象層的另一種異常,再將其拋出。
(4)假如在catch代碼塊中不能采取任何措施,那就不要捕獲異常,而是用throws子句聲明異常拋出。
java 詳解異常處理原理 - Code-lover's Learning Notes - 博客頻道 - CSDN.NET.html
作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 )
漢字名:艾提拉(艾龍), EMAIL:[email protected]
轉載請注明來源: http://www.cnblogs.com/attilax/
Atiend
Java .classpath文件Classpath ent