不使用额外模块时C语言如何实现类似Python的try/except功能?
C语言实现运行时错误统一打印指定内容的方案
C语言没有原生的异常机制,不过可以通过标准库自带的信号处理、setjmp/longjmp组合实现类似Python try..except的效果,无需引入任何额外模块。
方案1:全局致命错误捕获
如果只需要出错时打印指定字符串后退出程序,直接注册运行时错误对应的信号处理函数即可,常见的运行时错误都会触发对应的系统信号:
- SIGSEGV:段错误(访问非法内存、空指针解引用等)
- SIGFPE:浮点异常(除零、溢出等)
- SIGILL:非法指令
- SIGABRT:程序主动调用
abort()触发的终止 - SIGTERM:外部发送的终止信号
示例代码如下:
#include <stdio.h> #include <stdlib.h> #include <signal.h> void error_handler(int sig) { // 这里替换为你要打印的指定字符串 printf("程序运行发生错误!\n"); exit(EXIT_FAILURE); } int main() { // 为所有常见运行错误注册统一处理函数 signal(SIGSEGV, error_handler); signal(SIGFPE, error_handler); signal(SIGILL, error_handler); signal(SIGABRT, error_handler); signal(SIGTERM, error_handler); // 你的业务代码,这里举个除零的测试例子 int a = 1 / 0; return 0; }
方案2:局部错误捕获(类似try..except,程序不退出)
如果需要捕获错误后不退出,继续执行后续逻辑,可以搭配setjmp和longjmp实现上下文跳转:
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <setjmp.h> static jmp_buf jump_env; void error_handler(int sig) { // 这里替换为你要打印的指定字符串 printf("程序运行发生错误!\n"); // 跳转回setjmp的位置,返回值设为1 longjmp(jump_env, 1); } int main() { // 注册信号处理函数 signal(SIGSEGV, error_handler); signal(SIGFPE, error_handler); signal(SIGILL, error_handler); signal(SIGABRT, error_handler); signal(SIGTERM, error_handler); // 类似try块:第一次调用setjmp返回0,进入正常执行分支 if (setjmp(jump_env) == 0) { // 可能出错的业务代码,这里举个空指针解引用的测试例子 int *p = NULL; *p = 10; printf("业务代码执行正常\n"); } // 类似except块:longjmp跳转后setjmp返回非0,进入错误处理分支 else { printf("错误处理逻辑执行,程序可继续运行\n"); } printf("程序正常结束\n"); return 0; }
注意事项
- 仅能捕获触发系统信号的运行时错误,业务逻辑层面的错误码需要你自行判断后触发错误处理逻辑
setjmp/longjmp不会自动处理资源回收,try块内申请的堆内存、打开的文件描述符等需要你手动管理,避免泄漏- 所有用到的接口均为C标准库原生提供,兼容C89及以上标准,无需引入任何第三方依赖
内容的提问来源于stack exchange,提问作者Golden
相关产品推荐
相关产品推荐

