異常其實是“異常事件”的簡寫,那麼關於異常的定義是:
- 異常是一個事件,它發生在程序的執行過程中,使得程序指令的正常流程中斷。
異常中的“抓拋”其實只是“捕獲異常”和“拋出異常”而已,程序首先會“拋出異常”,然後再去捕獲異常,關於兩者的作用過程,請看下面的深入分析:
- 什麼是拋出異常呢?
當一個方法內部發生錯誤,這個方法會創建一個對象,並將該對象傳給運行系統。
這個對象稱之爲“異常對象( exception object )”,它包含錯誤的信息——錯誤類型和錯誤發生時的程序狀態。
創建一個異常對象並將該對象傳遞給運行系統的過程就稱之爲“拋出異常” - 什麼是捕獲異常呢?
在方法拋出異常後,運行系統會嘗試去尋找能夠處理異常的“東西”,這些能夠處理異常的“東西”其實是一個集合,在這個集合中的每一個“東西”都可能處理異常,那麼這些“東西”們是指那些呢?
其實不難理解,這些“東西”們就是一個有序方法列表,他們從main()方法開始,層層調用,直到某個方法出現了錯誤。這個方法列表也被稱之爲“調用棧(call stack)”。見下表
運行系統會在調用棧中檢索一個包含有處理該異常代碼塊的方法。(這個代碼塊也被稱爲一個“異常處理器(exception handler)”)。這個檢索順序是這樣的,它首先從發生異常的方法開始,然後按調用棧的逆向繼續檢索下去。
當找到一個合適(appropriate)的異常處理器,運行系統就會把異常傳遞給該處理器。那什麼才能算得上“合適的異常處理器”呢?如果一個被拋出的異常對象的類型匹配得上可以被某一異常處理器可以處理的類型,那麼這個異常處理就被認爲是“合適的異常處理器”。
選擇處理器的過程就稱之爲“捕獲異常”。
如果運行系統耗盡一切搜索完調用棧中的所有方法也沒有找到異常處理器,那麼運行系統就會中斷。