网站源码在线查询上海网站 建设
2026/4/6 7:32:30 网站建设 项目流程
网站源码在线查询,上海网站 建设,知名商业网站有哪些,郑州百度seo关键词在C中我们可以使用try/catch来捕获异常#xff0c;但是C语言中没有这样的关键字#xff0c;只有setjmp和longjmp函数#xff0c;它们的常规用法是先设置信号捕获函数#xff0c;再调用setjmp#xff0c;在信号捕获函数中调用longjmp#xff0c;如果出现异常则会跳到setjm…在C中我们可以使用try/catch来捕获异常但是C语言中没有这样的关键字只有setjmp和longjmp函数它们的常规用法是先设置信号捕获函数再调用setjmp在信号捕获函数中调用longjmp如果出现异常则会跳到setjmp后面#includesetjmp.h#includesignal.h#includestdio.hjmp_buf bufvoidsig(ints){switch(s){caseSIGSEGV:caseSIGINT:caseSIGFPE:(void)signal(s,sig);longjmp(buf,1);break;default:break;}}intmain(intargc,char*argv[]){(void)signal(SIGINT,sig);(void)signal(SIGFPE,sig);(void)signal(SIGSEGV,sig);if(setjmp(buf)0){int*pnullptr;*p0;}else{printf(exception\n);}我们可以使用宏来模拟try,catch#defineTRYif(setjmp(buf)0){#defineCATCH\}\else这样就可以写成下面的形式了TRY{}CATCH{}目前这种形式不支持嵌套捕获比如TRY{TRY{}CATCH{}//如果这里出现异常就不能捕获}CATCH{}要支持捕获也很简单把jmp_buf设置成数组再使用一个变量来记录深度使用一次TRY则加1CATCH时减1即可jmp_buf buf[256]{};uint8_tdepth0;#defineTRYif(setjmp(buf[depth])0){#defineCATCH\--depth;\}\elsevoidsig(ints){switch(s){caseSIGSEGV:caseSIGINT:caseSIGFPE:(void)signal(s,sig);longjmp(buf[--depth],1);break;default:break;}}测试代码#includesetjmp.h#includesignal.h#includestdint.h#includestdio.hjmp_buf buf[256]{};uint16_tdepth0;#defineTRYif(setjmp(buf[depth])0){#defineCATCH\--depth;\}\elsevoidsegv(){int*vnullptr;*v1;printf(%p\n,v);}voiddiv0(){intv0;printf(%d\n,1/v);}voidsig(ints){switch(s){caseSIGSEGV:caseSIGINT:caseSIGFPE:(void)signal(s,sig);longjmp(buf[--depth],1);break;default:break;}}voidtest(){TRY{TRY{segv();}CATCH{printf(SIGSEGV exception\n);}div0();}CATCH{printf(SIGFPE exception\n);}}intmain(intargc,char*argv[]){(void)signal(SIGINT,sig);(void)signal(SIGFPE,sig);(void)signal(SIGSEGV,sig);TRY{test();}CATCH{printf(test exception\n);}printf(ok\n);return0;}如果是使用的VC编译器和调试器在除0的地方会直接断下来并不会继续执行所以触发不了SIGFPE信号这是由于SEH异常机制导致如果想要实现与GCC一样的行为即POSIX行为则需要拦截SEH手动触发SIGFPE信号#if_MSC_VER#includewindows.hLONG WINAPIseh_handler(EXCEPTION_POINTERS*e){if(e-ExceptionRecord-ExceptionCodeEXCEPTION_INT_DIVIDE_BY_ZERO){raise(SIGFPE);returnEXCEPTION_CONTINUE_EXECUTION;}returnEXCEPTION_CONTINUE_SEARCH;}#endif再调用#if_MSC_VERAddVectoredExceptionHandler(1,seh_handler);#endif完整代码#includesetjmp.h#includesignal.h#includestdint.h#includestdio.h#if_MSC_VER#includewindows.hLONG WINAPIseh_handler(EXCEPTION_POINTERS*e){if(e-ExceptionRecord-ExceptionCodeEXCEPTION_INT_DIVIDE_BY_ZERO){raise(SIGFPE);returnEXCEPTION_CONTINUE_EXECUTION;}returnEXCEPTION_CONTINUE_SEARCH;}#endifjmp_buf buf[256]{};uint16_tdepth0;#defineTRYif(setjmp(buf[depth])0){#defineCATCH\--depth;\}\elsevoidsegv(){int*v0;*v1;printf(%p\n,v);}voiddiv0(){intv0;printf(%d\n,1/v);}voidsig(ints){switch(s){caseSIGSEGV:caseSIGINT:caseSIGFPE:(void)signal(s,sig);longjmp(buf[--depth],1);break;default:break;}}voidtest(){TRY{TRY{segv();}CATCH{printf(SIGSEGV exception\n);}div0();}CATCH{printf(SIGFPE exception\n);}}intmain(intargc,char*argv[]){#if_MSC_VERAddVectoredExceptionHandler(1,seh_handler);#endif(void)signal(SIGINT,sig);(void)signal(SIGFPE,sig);(void)signal(SIGSEGV,sig);TRY{TRY{TRY{segv();}CATCH{printf(SIGSEGV exception\n);}div0();}CATCH{printf(SIGFPE exception\n);}test();}CATCH{printf(test exception\n);}printf(ok\n);return0;}如果对你有帮助欢迎点赞收藏

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询