在做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;
|