这个设计的程序有一个很大的问题,那是它只能在同级的函数下使用try。

  这是什么意思呢?如果我需要这样使用:

Int main()
{
Try
{
f();
}
catch(err)
{
printf(“%d”, err);
}
}
Void f()
{
G();
// some codes follows
}
Void g()
{
Throw(3);
}

  在g()throw出异常3的时候,main函数没有办法直接捕捉,而是必须在f()函数下面继续执行后面的语句。是这套设计的机制多个嵌套的函数是没有办法实施的。

  那么还有什么办法可以解决这个问题呢?Goto可以吗?不可以,goto也只能在同级的函数下使用。goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点。

  后找到一个方法:

#include
int setjmp(jmp_buf env)
Returns: 0 if called directly, nonzero if returning from a call to longjmp.
void longjmp(jmp_buf env, int val);

  setjmp 和longjmp这2个函数可以在不同的函数进行跳转,只要设置他们的上下文,在用longjmp跳转到这设置好的上下文当中可以了!!

  这2个函数的使用方法:

#include
#include
jmp_buf ebuf;
void f2(void);
int main(void)
{
int i;
printf(“1”);
i=setjmp(ebuf);
if(i==0)
{
f2();
printf(“This will not be printed.”);
}
printf(“%d”,i);
return 0;
}
void f2(void)
{
printf(“2”);
longjmp(ebuf,3);
}