void OZ()
{
printf("there 's no placelike home\n");
longjmp(kansas, 47);
}
jmp_buf kansas;
int main(int argc, char* argv[])
{
if(setjmp(kansas)==0) OZ();
else printf(" I have a dream..\n");
return 0;
}//执行完OZ()后,会立即跳转到printf(" I have a dream..\n");执行
setjmp()是个特别的函数,当被调用的时候,他吧当前的进程状态的相关信息放到buff中,并返回0;假如使用longjmp对同一个buff操作,这就像再次从setjmp中返回,即正确弹出setjmp的后端。这时返回值对于longjmp是第二个参数,所以能发现实际上从longjum中返回了。
34. 异常定制和抛出
class up{};
class fit{};
void g();
void f(int i) throw (up, fit)
{
switch(i)
{
case 1: throw up();
case 2: throw fit();
}
g();
文章整理:西部数码--专业提供域名注册、虚拟主机服务
}
void g(){throw 47;}
void my_unexpected()
{
printf("unexpected handle!\n");
exit(1);
}
int main(int argc, char* argv[])
{
set_unexpected(my_unexpected);
for(int i=1;i<=3;i )
{
try{ f(i);}
catch(up) {printf("catch up\n");}
catch(fit){printf("catch fit\n");}
}
return 0;
}
set_unexpected配置处理系统不认识的异常情况(缺省是中断)(异常处理安装器缺省指向terminate())。上面我们定义了up、fit两种异常抛出类,并抛出了这两种异常,来捕获。抛出异常时也生成了异常的一个对象。Catch(…){}
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



