据我所知有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);
}
动态是编译器帮你插入一堆代码(关键性的代码就是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);
}