You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用额外模块时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:01