不要goto,为C语言添加try-catch 热? 400 报错
另一篇帖子正在火热地讨论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”这句话。
楼主是说这个么:http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html ?######cool######
完全没看懂的路过。。。
try catch是C的关键字不?如果不是,楼主的代码如何通过编译?
######回复 @铂金眼 : 感谢提醒,是粗心了。。。######小心看程序的开头,我这个门外汉都看出来了!######完全没看懂的路过。。。
try catch是C的关键字不?如果不是,楼主的代码如何通过编译?
try和catch不是C语言的关键字,而是我定义的几个宏,看代码上半部分。
######楼主这么急着打脸,居心何在?######回复 @young7 : 因为没人@ 他,;-p######尚未见半桶水兄现身,以他的性格,看到跟他意见相左的应该又要跳出来作指点江山状了(哈个屁什么的),至今尚未见到身影,实乃奇怪######如果要完全和Java的try-catch保持一致,那的确还要做些工作,例如catch能捕捉到throw出来的对象。
这边只是演示如何在C语言里实现try-catch,需要其他的功能可以在这段代码的基础上继续改进。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。