TBOX封裝了一套跨平臺的異常捕獲實現,來模擬windows的seh異常處理功能,並且是線程安全的。linux
使用signal 捕獲異常信號git
使用sigsetjmp保存現場寄存器和信號掩碼,出現異常後使用 siglongjmp 跳轉到異常處理過程,並恢復狀態github
使用線程局部存儲維護 sigjmpbuf 寄存器現場狀態堆棧,保證多線程安全,而且能夠實現多層嵌套捕獲處理。windows
這個就不用多說了,在vs下直接用 __try、__except 關鍵字就好了,若是在mingw下編譯, 經過 setjmp實現也很方便。安全
注: 因爲使用setjmp 進行寄存器現場保護, 若是使用整型局部變量, 有可能會被編譯器優化到寄存器中。
因此try內部的修改,可能會在異常捕獲後,被會恢復掉。
最好加上volatile來禁止優化。多線程
__tb_volatile__ tb_size_t i = 0; __tb_try { i++; // 捕獲段錯誤 *((__tb_volatile__ tb_size_t*)0) = 0; // 捕獲除0錯誤 // __tb_volatile__ tb_size_t a = 0; a /= a; } __tb_except(1) { // __tb_except(1): 處理異常 // __tb_except(0): 路由異常到外層, 支持嵌套處理 } __tb_end
有些平臺異常捕獲是被禁用的,因此若是確實想要使用這種異常捕獲機制,首先得確保對應平臺下的配置文件plat/xxx/config.h優化
定義了TB_CONFIG_EXCEPTION_ENABLE這個宏,而後從新編譯才行。.net
雖然tbox對異常支持的挺完善了,可是我的仍是不建議太過頻繁的使用異常捕獲。線程