目录

C 語法上使用 goto 或是 setjmp/longjmp 實現例外處理。goto 只能做本地跳轉,亦即在同一函式內部進行跳轉。setjmp/longjmp 則能做到非本地跳轉。setjmp 會保留當前進程的狀態,以供之後的 longjmp 回到 setjmp 所在位置。setjmp/longjmp 並非以 stack unwind 實現1)

C++ 語法上使用 try/catch/throw 實現例外處理,C++ 內部主要使用 table-driven 的方式實現。簡單來講,編譯和鏈結時期會建立一張表,一段範圍的計數器值會對應到例外處理語句。當執行時期發生例外時,運行期函式庫會表跳轉至對應的例外處理語句。

術語 stack unwinding,又稱棧回溯 (棧回退),此為一搜尋例外處理代碼的過程。當例外被丟出時,棧會以 callee 到 caller 的方向消退,以搜尋例外處理代碼處理該例外。棧回溯的過程中,當脫離某一個棧的範圍時,針對配置在該棧上的物件,運行期函式庫會呼叫其解構子。棧回溯的效果就如同除了例外處理代碼 (即 catch) 所在的函式以外,往下曾經被調用過的函式沒有作用,彷彿未被調用。

系列文章

代碼

外部連結