多此一舉,C實現 try-catch

在做NtyTcp 的時候,有一些,就想用c來實現一套try-catch異常處理子系統。

不討論C語言本身為什麼不加try-catch,每個開發的朋友對於這個問題,都能說出一大堆的理由。

其實我也是不太喜歡強行在c中加入一個try-catch。就像把try-catch的原理跟自己的體會寫出來。

首先我們來看看,try-catch的使用情景。

多此一舉,C實現 try-catch

try{ } 塊是可能有異常的拋出的地方。throw Excep

catch (Excep) { } 是 捕獲相應拋出異常的地方。

finally { } 是不論什麼情形下,都是需要執行的代碼塊。

如果實現一套如此機制,有何實現的基礎依賴。那就是setjmp與longjmp

講到setjmp與longjmp,也是更說明一下

多此一舉,C實現 try-catch

先來定義個

全局的jmp_buf env; 用來保存跳轉的上下文。

int count = 0; 用來保存跳轉返回值的。有點繞口,就是記錄setjmp返回值的。

看到這裡也許對setjmp與longjmp有點理解。再換個馬甲,相信更有體會。

多此一舉,C實現 try-catch

try-catch就已經初具雛形了。這樣只是基本實現,還有三個問題沒有解決。

  1. 如何保證線程安全。
  2. 如何解決try-catch 嵌套。
  3. 如何避免,在不加try的代碼塊直接Throw。

如何保證線程安全。

使用線程的私有數據 pthread_key_t ,每一個線程都有一個try-catch的上下文環境。

如何解決try-catch嵌套的問題

使用一個棧式數據結構,每次try的時候壓棧,每次throw的時候 出棧。

如何避免,在不加try的代碼塊直接Throw,

這個問題就比較好理解。既然每次try需要壓棧,如果不加try,所以棧裡面沒有數據。在Throw之前先查看棧裡面有沒有數據。

那現在問題又來了,在pthread_key_t 與 鏈式棧如何結合? 先看如下結構體,也許會有新的認識,結構體裡面有一個prev的域。

這樣就能跟pthread_key_t 來結合,每次講結構體指針保存在pthread_key_t中,獲取完之後,拿到prev的值。

多此一舉,C實現 try-catch

讀者如果需要源碼,請移步我的github上面star,fork:https://github.com/wangbojing

更多精彩好文,請關注:頭條號零聲社區,WeChat public number:零聲社區

零聲靜看傾聽,提升思想認知。


分享到:


相關文章: