多此一举, C实现 try-catch

本文探讨了如何在C语言中模仿try-catch异常处理机制,利用setjmp和longjmp实现。通过线程私有数据pthread_key_t确保线程安全,栈式结构解决嵌套try-catch,并避免在无try块时直接throw的情况。作者提供了完整的实现代码供读者参考。
摘要由CSDN通过智能技术生成

在做NtyTcp的时候,有一些,就想用c来实现一套try-catch异常处理子系统。


不讨论C语言本身为什么不加try-catch,每个开发的朋友对于这个问题,都能说出一大堆的理由。


其实我也是不太喜欢强行在c中加入一个try-catch。就像把try-catch的原理跟自己的体会写出来。


首先我们来看看,try-catch的使用情景。

1
2
3
4
5
6
7
try  {
     throw  Excep;
catch  (Excep) {
 
} finally {
 
}


try{ } 块是可能有异常的抛出的地方。throw Excep

catch (Excep) { } 是 捕获相应抛出异常的地方。

finally { } 是不论什么情形下,都是需要执行的代码块。


如果实现一套如此机制,有何实现的基础依赖。那就是setjmp与longjmp


讲到setjmp与longjmp,也是更说明一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <setjmp.h>
#include <stdio.h>
 
jmp_buf  env;
int  count = 0;
 
 
void  sub_func( int  idx) {
     printf ( "sub_func --> idx:%d\n" , idx);
     longjmp (env, idx);
}
 
int  main( int  argc,  char  *argv[]) {
 
     int  idx = 0;
 
     if  ((count =  setjmp (env)) == 0) {
         printf ( "count:%d\n" , count);
         sub_func(++idx);
     else  if  (count == 1) {
         printf ( "count:%d\n" , count);
         
     } {
         printf ( "other count\n" );
     }
 
     return  0;
}


先来定义个 

全局的jmp_buf env; 用来保存跳转的上下文。

int count = 0; 用来保存跳转返回值的。有点绕口,就是记录setjmp返回值的。


看到这里也许对setjmp与longjmp有点理解。再换个马甲,相信更有体会。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <setjmp.h>
#include <stdio.h>
 
jmp_buf  env;
int  count = 0;
 
#define Try     if ((count = setjmp(env)) == 0)
 
#define Catch(e)    else if (count == (e))
 
#define Finally    ;
 
#define Throw(idx)    longjmp(env, (idx))
 
 
 
void  sub_func( int  idx) {
     printf ( "sub_func --> idx:%d\n" , idx);
     Throw(idx);
}
 
int  main( int  argc,  char  *argv[]) {
 
     int  idx = 0;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值