觅风易语言学院 定期清理不活跃会员公告 绑定QQ
导读
易语言5.6完美破解版,可静态编译,绿色无

学习易语言 讲究的是系统,如果你正在四处闲逛,你懂的永远是皮毛! 觅风论坛正在为每个困惑的对易语言 详细

[c] c语言没有try catch的替代方案

[复制链接]

微信扫一扫 分享朋友圈

传世魔王 发表于 2020-6-19 00:04:13 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

setjmp与longjmp

后缀jmp指的就是jump,关看名字就能猜到这哥俩是干啥的了。使用他们俩就可以让程序控制流转移,进而实现对异常的处理。

异常处理的结构可以划分为以下三个阶段:

  • 准备阶段:在内核栈保存通用寄存器内容
  • 处理阶段:保存硬件出错码和异常类型号,然后向当前进程发送信号
  • 恢复阶段:恢复保存在内核栈中的各个寄存器内容,返回当前进程的断电处继续执行

过程有点类似递归,只有文字你可能看的有点云里雾里,我们结合一个小例子来看看


  1. #include <stdio.h>
  2. #include <setjmp.h>

  3. static jmp_buf buf;

  4. void second(void) {
  5. printf("second\n");
  6. // 跳回setjmp的调用处 - 使得setjmp返回值为1  
  7. longjmp(buf, 1);   
  8. }

  9. void first(void) {
  10. second();
  11. //这行到不了,因为second里面longjmp已经跳转回去了
  12. printf("first\n");   
  13. }

  14. int main() {
  15. int rc;
  16. rc = setjmp(buf);
  17. if (rc==0) {  
  18.   // 进入此行前,setjmp返回0
  19.   first();
  20. }
  21. // longjmp跳转回,setjmp返回1,因此进入此行
  22. else if(rc==1){     
  23.   printf("main\n");  
  24. }

  25. return 0;
  26. }
  27. /*
  28. the ressult as:
  29. second
  30. main
  31. */
复制代码

现在我们再来看看两个函数的声明:

  • setjmp(env) :将程序上下文存储在env中
  • longjmp(env,status):env指代setjmp中所保存的函数执行状态变量,status则是作为setjmp的返回值

当然你也可以用switch代替上面的if else,其实try catch就相当于上面的那个函数你可以参考这个实现try catch

signal信号处理

个人觉得这个在linux下更好用,并且也提供了更多的信号量宏。

下面给出的是signal头文件中的定义


  1. #define SIGINT   2 // interrupt
  2. #define SIGILL   4 // illegal instruction - invalid function image
  3. #define SIGFPE   8 // floating point exception
  4. #define SIGSEGV   11 // segment violation
  5. #define SIGTERM   15 // Software termination signal from kill
  6. #define SIGBREAK  21 // Ctrl-Break sequence
  7. #define SIGABRT   22 // abnormal termination triggered by abort call
复制代码

这里仅给出维基上的例子


  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. static void catch_function(int signal) {
  5. puts("Interactive attention signal caught.");
  6. }

  7. int main(void) {
  8. if (signal(SIGINT, catch_function) == SIG_ERR) {
  9.   fputs("An error occurred while setting a signal handler.\n", stderr);
  10.   return EXIT_FAILURE;
  11. }
  12. puts("Raising the interactive attention signal.");
  13. if (raise(SIGINT) != 0) {
  14.   fputs("Error raising the signal.\n", stderr);
  15.   return EXIT_FAILURE;
  16. }
  17. puts("Exiting.");
  18. return 0;
  19. }
复制代码



总结

到此这篇关于c语言没有try catch的替代方案的文章就介绍到这了




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注我们:觅风论坛与你快乐分享

官方QQ

服务客服QQ:

466-352-670

客服QQ:466352670

Email:466352670@qq.com

Powered by WWW.EYYBA.COM X3.4© 2001-2013 Inc.   版权所有   

觅风论坛  沪ICP备15020893号-1