exception 的实现

博客介绍了异常处理的动态和静态两种方法。动态方法由编译器插入setjmp和longjmp代码,影响性能但无需系统相关支持;静态方法生成查找表,开销低但与操作系统相关。还给出了动态方法的伪代码及编译器插入代码的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

据我所知有2种方法,动态和静态
动态是编译器帮你插入一堆代码(关键性的代码就是setjmp和
longjmp),在你每个throw catch的地方都插入这些代码,会
影响整体性能(这个不需要什么系统相关的东西就能实现)

静态的就是生成一个expection handler的查找表,然后每次
抛出的时候就去查那么一查,如果没有异常情况的话,这个方式
开销低,但是这个就要和操作系统相关了,如果虚拟机就
。。。嘿嘿。


然后,简单的说一下动态方法,我具体代码懒的写(其实怕写不出)
给一点伪代码:

struct Exception{
char* name;
int typecode;
//...others
};

int HashFun(char*)//这个函数把字符串搞成int,是唯一对应的
{...}

Exception* CreateException(char* name)//新建一个exception
{..}

void FreeException(Exception*)//销毁它!
{..}

//--------------------------------------------------------
struct ExceptionHandler
{
int typecode;
jmp_buf location; //这里是比较重要的。。。
};
struct ExceptionHandlerStack
{ int size;//现在list的大小
  ExceptionHandler list[MAX]; //一个Handler的链
  ExceptionHandlerStack(); //初始化工作
~ExceptionHanclerStack();//销毁工作。。。
  static ExceptionHandler* Push(char*name)  //根据name,用hash函数生成typecod
e,然后填入  链最后一个Handler里面,然后返回它
  static Pop();//嗯。。。很明显
  static void throwException(Exception *ex)//抛出异常
  {
     在链里面找啊找,找到了typecode相同的Handler就
     longjmp(list[size].location,(int)ex); //关键函数。。。
  }
};

好基本实现差不多了,然后讲编译器插入的代码
本来是:
void Fun()
{
try{
    Excetpion *ex;
    ex = CreateException("name");
     throwException(ex);
}catch(Exception *ex)
{
   dosomething(ex);
}
好了,编译器改成。。。
void Fun()
{
ExceptionHandler* hd;
int ret;
hd = ExceptionhandlerList::push("name");
ret = setjmp(hd->location);
if(ret ==0)
{ Excetpion* ex;
  ex = CreateException("name);
  ExcetpionhandlerList::throwException(ex);
}else
{  Exception* ex;
   ex = (exception*)ret;
   dosomething(ex);
  FreeException(ex);
  }
ExceptionHanclerList::pop(hd);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值