开发者社区> 问答> 正文

不要goto,为C语言添加try-catch 热? 400 报错

不要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”这句话。

展开
收起
爱吃鱼的程序员 2020-06-03 15:06:10 689 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    楼主是说这个么:http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html ?######cool######

    完全没看懂的路过。。。

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

    ######回复 @铂金眼 : 感谢提醒,是粗心了。。。######小心看程序的开头,我这个门外汉都看出来了!######

    引用来自“ZeroOne”的评论

    完全没看懂的路过。。。

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

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

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

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

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

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

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

    引用来自“redraiment”的评论

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

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

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

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

    引用来自“redraiment”的评论

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

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

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

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

    引用来自“redraiment”的评论

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

    引用来自“redraiment”的评论

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

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

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

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

    引用来自“redraiment”的评论

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

    引用来自“redraiment”的评论

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

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

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

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

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

    2020-06-03 17:12:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载