在C语言中实现类似面向对象语言的异常处理机制

前言

在使用C语言编写代码的时候不能使用类似Java的异常处理机制是非常难受的,所以今天放假用了一下午的时间简单实现了一下。

效果展示

先看一下示例程序:

#include "error/Error.h"

#define TEST_ERROR_1
#define TEST_ERROR_2

void func(int);

int main() {
    try {
        func(1); 
    } catch(TEST_ERROR_1) {
        stdErr();
    } catch(TEST_ERROR_2) {
        stdErr();
    } finally{
        printf("finally\n");
    };
    return 0;
}

void func(int a)throws TEST_ERROR_1 TEST_ERROR_2 {
    if (a == 1) {
        throw Error(TEST_ERROR_1, "测试错误1");
    } else if (a == 2) {
        throw Error(TEST_ERROR_2, "测试错误2");
    } else {
        printf("无错误\n");
    }
}

当给func传入1、2、3时控制台的输出如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现原理

难点在于程序的跳转,通过宏定义和<setjmp.h>就可以实现了,代码很少,一看就懂:

  • Error.h:
#ifndef DSA_ERROR_H
#define DSA_ERROR_H

#include <setjmp.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>

#define try if(!(setjmp(env)))
#define catch(TYPE) else if(strcmp(#TYPE,error.type)==0)
#define finally
#define throw
#define throws
#define Error(TYPE, MSG) do{error.type=#TYPE;error.msg=MSG;error.line=__LINE__;error.date=__DATE__;error.file=__FILE__;longjmp(env,1);}while(false)

struct Error {
    char *type;
    int line;
    char *msg;
    char *date;
    char *file;
};
extern jmp_buf env;
extern struct Error error;

/**
 * 控制台打印异常信息
 */
void stdErr();

#endif //DSA_ERROR_H
  • Error.c
#include "Error.h"

jmp_buf env;
struct Error error = {NULL, 0, NULL, NULL, NULL};

void stdErr() {
    printf("%s %s  %d %s\n", error.date, error.file, error.line, error.msg);
}

缺陷

由于C语言编译器不支持这种机制,所以当抛出一个异常但又不捕获的时候程序会在异常处终止但不会给出异常提示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亻乍屯页女子白勺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值