多此一举,C实现 try-catch

在做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:零声社区

零声静看倾听,提升思想认知。