簡介
異常鏈是一種面向對象編程技術,指將捕獲的異常包裝進一個新的異常中並重新拋出的異常處理方式。原異常被保存為新異常的一個屬性(比如 cause)。這個想法是指一個方法應該拋出定義在相同的抽象層次上的異常,但不會丟棄更低層次的信息。
比如,播放視頻檔案的方法可能捕獲讀取檔案過程中的異常,將其包裝在新拋出的播放視頻檔案的異常中。用戶界面部分不需要知道讀取位元組塊、 eof() 調用或其他操作時發生的錯誤,這是意外的檔案結尾、讀取錯誤或者其他的錯誤:用戶界面只需要從 cause屬性中提取出異常信息。用戶界面層會有自身一系列的異常。若對 cause感興趣,可以在調試期間、或在適當的日誌中查看異常的堆疊跟蹤信息( stack track )。
Java中受控異常(Checked exceptions)特彆強調了拋出正確類型的異常,從 Java 1.4版本開始,幾乎所有的異常都支持異常鏈。
在運行時環境,比如 Java 或 .Net 中,都有工具連線到運行時引擎;每當感興趣的異常發生,這些工具就記錄下記憶體中的調試信息以及拋出異常的時間(棧和堆上的值)。這些工具提供異常截取(Exception Interception)功能,它們為生產環境、測試環境、開發環境中的Java程式中出現的的異常提供了 root-cause信息。
面向對象程式設計
面向對象程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程式的基本單元,將程式和數據封裝其中,以提高軟體的重用性、靈活性和擴展性,對象里的程式可以訪問及經常修改對象相關連的數據。在面向對象程式編程里,電腦程式會被設計成彼此相關的對象。
面向對象程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對計算機下達的指令。面向對象程式設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,面向對象程式設計推廣了程式的靈活性和可維護性,並且在大型項目設計中廣為套用。此外,支持者聲稱面向對象程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。
當我們提到面向對象的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。許多流行的程式語言是面向對象的,它們的風格就是會透由對象來創出實例。
重要的面向對象程式語言包含Common Lisp、Python、C++、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、Ruby與PHP等。
異常處理
異常處理,是程式語言或計算機硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。
各種程式語言在處理異常方面具有非常顯著的不同點(錯誤檢測與異常處理區別在於:錯誤檢測是在正常的程式流中,處理不可預見問題的代碼,例如一個調用操作未能成功結束)。某些程式語言有這樣的函式:當輸入存在非法數據時不能被安全地調用,或者返回值不能與異常進行有效的區別。例如,C語言中的atoi函式(ASCII串到整數的轉換)在輸入非法時可以返回0。在這種情況下編程者需要另外進行錯誤檢測(可能通過某些輔助全局變數如C的errno),或進行輸入檢驗(如通過正則表達式),或者共同使用這兩種方法。
通過異常處理,我們可以對用戶在程式中的非法輸入進行控制和提示,以防程式崩潰。
從進程的視角,硬體中斷相當於可恢復異常,雖然中斷一般與程式流本身無關。
從子程式編程者的視角,異常是很有用的一種機制,用於通知外界該子程式不能正常執行。如輸入的數據無效(例如除數是0),或所需資源不可用(例如檔案丟失)。如果系統沒有異常機制,則編程者需要用返回值來標示發生了哪些錯誤。