博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C 的异常捕捉实现
阅读量:6322 次
发布时间:2019-06-22

本文共 1032 字,大约阅读时间需要 3 分钟。

hot3.png

    最近一直在关注setjmp!

    发现用宏包装后的setjmp捕捉异常其实蛮native,所以简单的写了一个实现。

 

#include 
#include
#include
#include
#include
#include
jmp_buf env;pthread_t p;#define __try__ do{if(!setjmp(env)){#define __catch__ }else{\#define __finally__ }}while(0);void back(int sig){ switch(sig){ case SIGSEGV: longjmp(env,1); break; case SIGFPE: longjmp(env,1); break; default: exit(-1); }}void stack_protect(){ signal(SIGSEGV,&back); signal(SIGFPE,&back);}void work(){ __try__; printf("%d\n",1/0); __catch__; printf("1/0 was successful...\n"); __finally__; printf("work function end...\n");}int main(int argc, char const *argv[]){ stack_protect(); pthread_create(&p,NULL,(void*)work,NULL); sleep(1); return 0;}

 

    可以看到,用简单的setjmp 回跳与 do...while 内嵌if..else(也可用switch...case实现多选项)的catch捕捉可以保证执行流程的同步。

优点:

    由sig感知异常并恢复当前运行栈,也保证了业务面的不感知。

 

缺点:

    需要捕捉的异常需要自己在初始化函数中定义。

 

注意:

    此功能暂时无法运行在多线程环境下!

    可以通过加工与条件、线程判断进行恢复,但这就需要根据实际业务逻辑来定制。^_^

 

转载于:https://my.oschina.net/CandyMi/blog/997829

你可能感兴趣的文章
我的友情链接
查看>>
我的友情链接
查看>>
Linux LTP 测试框架
查看>>
log4j 每次运行生成文件
查看>>
“经常加班”有误区
查看>>
jquery各种事件触发实例
查看>>
我的友情链接
查看>>
MY TroubleShooting
查看>>
Linux 常用目录管理命令(cd pwd mkdir rmdir)
查看>>
java程序员菜鸟进阶(四)oracle基础详解(四)oracle开启和关闭服务程序——解决安装oracle占用大量内存...
查看>>
Flask_学习笔记_09: Flask中的继承
查看>>
Mahout源码目录说明
查看>>
我的友情链接
查看>>
Java学习日志(17-2-集合框架工具类Arrays及其他特性)
查看>>
HTTP响应头和请求头信息对照表
查看>>
Chrome完美屏蔽优酷广告及黑屏教程
查看>>
一份不错的php面试题(附答案)
查看>>
前端工程资源发布、优化
查看>>
nginx安装(ubuntu14.04)
查看>>
SQLServer2008备份和恢复
查看>>