不要goto,为C语言添加try-catch

redraiment 发布于 2014/08/04 13:18
阅读 3K+
收藏 21

另一篇帖子正在火热地讨论C语言中使用goto的问题,主要的观点是用goto来统一处理异常情况,即出错后全部goto到底部的异常处理代码块。

其实这个思路就是C++、Java等语言中try-catch的思路,并且try-catch相比goto还有一个优势:子函数里也能抛出异常;而goto只能在当前函数里,范围不能超出当前函数。

因此,索性就为C语言添加一个try-catch功能,避免写goto代码。下面是一个简单的例子,大家可以在这个基础上做扩充:

#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>

jmp_buf __exception_context;

#define try if(!setjmp(__exception_context))
#define catch else
#define throw_exception longjmp(__exception_context, 1)

void foo(void) {
  puts("in foo");
  throw_exception;
}

int main(int argc, char* argv[]) {
  try {
    puts("you can see this");
    foo();
    puts("never see this");
  } catch {
    puts("catch an exception");
  }

  puts("final");

  return EXIT_SUCCESS;
}

执行的结果如下:

you can see this
in foo
catch an exception
final

正如我们期望的,foo这个函数里抛出了异常,所以输出的结果中没有“never see this”这句话。

加载中
2
EdwardYB
EdwardYB
楼主是说这个么:http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html ?
0
甘薯
甘薯

完全没看懂的路过。。。

try catch是C的关键字不?如果不是,楼主的代码如何通过编译?

甘薯
甘薯
回复 @铂金眼 : 感谢提醒,是粗心了。。。
OSC首席键客
OSC首席键客
小心看程序的开头,我这个门外汉都看出来了!
0
redraiment
redraiment

引用来自“ZeroOne”的评论

完全没看懂的路过。。。

try catch是C的关键字不?如果不是,楼主的代码如何通过编译?

try和catch不是C语言的关键字,而是我定义的几个宏,看代码上半部分。

0
纠结名字
楼主这么急着打脸,居心何在?
redraiment
redraiment
回复 @young7 : 因为没人@ 他,;-p
young7
young7
尚未见半桶水兄现身,以他的性格,看到跟他意见相左的应该又要跳出来作指点江山状了(哈个屁什么的),至今尚未见到身影,实乃奇怪
0
redraiment
redraiment

引用来自“纠结名字”的评论

楼主这么急着打脸,居心何在?
你猜?
redraiment
redraiment
回复 @young7 : 哈
young7
young7
我猜楼主抽得一手好脸 ,哈(怎么我也说哈,难道我也中毒了?)
0
纠结名字

引用来自“纠结名字”的评论

楼主这么急着打脸,居心何在?

引用来自“redraiment”的评论

你猜?
楼主,我不懂C,你不要骗我,这个能不能完全替代goto?另外,如果可以,你还能把finally加上吗?
0
redraiment
redraiment

引用来自“纠结名字”的评论

引用来自“纠结名字”的评论

楼主这么急着打脸,居心何在?

引用来自“redraiment”的评论

你猜?
楼主,我不懂C,你不要骗我,这个能不能完全替代goto?另外,如果可以,你还能把finally加上吗?
Java里没有goto,不照样写了这么多年。
redraiment
redraiment
回复 @Lyuans : Java中goto只是保留的关键字,没有goto语句。
Lyuans
Lyuans
谁说java没有goto
0
纠结名字

引用来自“纠结名字”的评论

引用来自“纠结名字”的评论

楼主这么急着打脸,居心何在?

引用来自“redraiment”的评论

你猜?
楼主,我不懂C,你不要骗我,这个能不能完全替代goto?另外,如果可以,你还能把finally加上吗?

引用来自“redraiment”的评论

Java里没有goto,不照样写了这么多年。
java帮忙做了很多才废掉goto的,我是担心你这代码的健壮性。。。
0
redraiment
redraiment

引用来自“纠结名字”的评论

引用来自“纠结名字”的评论

楼主这么急着打脸,居心何在?

引用来自“redraiment”的评论

你猜?
楼主,我不懂C,你不要骗我,这个能不能完全替代goto?另外,如果可以,你还能把finally加上吗?

引用来自“redraiment”的评论

Java里没有goto,不照样写了这么多年。

引用来自“纠结名字”的评论

java帮忙做了很多才废掉goto的,我是担心你这代码的健壮性。。。

如果要完全和Java的try-catch保持一致,那的确还要做些工作,例如catch能捕捉到throw出来的对象。

这边只是演示如何在C语言里实现try-catch,需要其他的功能可以在这段代码的基础上继续改进。

返回顶部
顶部