在做NtyTcp 的時候,有一些,就想用c來實現一套try-catch異常處理子系統。
不討論C語言本身為什麼不加try-catch,每個開發的朋友對於這個問題,都能說出一大堆的理由。
其實我也是不太喜歡強行在c中加入一個try-catch。就像把try-catch的原理跟自己的體會寫出來。
首先我們來看看,try-catch的使用情景。
try{ } 塊是可能有異常的拋出的地方。throw Excep
catch (Excep) { } 是 捕獲相應拋出異常的地方。
finally { } 是不論什麼情形下,都是需要執行的代碼塊。
如果實現一套如此機制,有何實現的基礎依賴。那就是setjmp與longjmp
講到setjmp與longjmp,也是更說明一下
先來定義個
全局的jmp_buf env; 用來保存跳轉的上下文。
int count = 0; 用來保存跳轉返回值的。有點繞口,就是記錄setjmp返回值的。
看到這裡也許對setjmp與longjmp有點理解。再換個馬甲,相信更有體會。
try-catch就已經初具雛形了。這樣只是基本實現,還有三個問題沒有解決。
- 如何保證線程安全。
- 如何解決try-catch 嵌套。
- 如何避免,在不加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的值。
讀者如果需要源碼,請移步我的github上面star,fork:https://github.com/wangbojing
更多精彩好文,請關注:頭條號零聲社區,WeChat public number:零聲社區
零聲靜看傾聽,提升思想認知。
閱讀更多 零聲社區 的文章