void main( void ) { int jmpret; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(1) longjmp(mark, 1); // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(2) longjmp(mark, 2); // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(-1) longjmp(mark, -1); // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( "Error 1\n"); break; case 2: printf( "Error 2\n"); break; case 3: printf( "Error 3\n"); break; default : printf( "Unknown Error"); break; } exit(0); } return; }
void Func1() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(1) longjmp(mark, 1); } void Func2() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(2) longjmp(mark, 2); } void Func3() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(-1) longjmp(mark, -1); } void main( void ) { int jmpret; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 // 下面的这些函数执行过程中,有可能出现异常 Func1(); Func2(); Func3(); // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( "Error 1\n"); break; case 2: printf( "Error 2\n"); break; case 3: printf( "Error 3\n"); break; default : printf( "Unknown Error"); break; } exit(0); } return; }
class Test { public: Test() ~Test() }obj; //注意,上面声明了一个全局变量obj void main( void ) { int jmpret; // 注意,这里将会导致程序崩溃,无条件退出 Func1(); while(1); jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 // 下面的这些函数执行过程中,有可能出现异常 Func1(); Func2(); Func3(); // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( "Error 1\n"); break; case 2: printf( "Error 2\n"); break; case 3: printf( "Error 3\n"); break; default : printf( "Unknown Error"); break; } exit(0); } return; }
int Sub_Func() { int jmpret, be_modify; be_modify = 0; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( "Error 1\n"); break; case 2: printf( "Error 2\n"); break; case 3: printf( "Error 3\n"); break; default : printf( "Unknown Error"); break; } //注意这一语句,程序有条件地退出 if (be_modify==0) exit(0); } return jmpret; } void main( void ) { Sub_Func(); // 注意,虽然longjmp的调用是在setjmp之后,但是它超出了setjmp的作用范围。 longjmp(mark, 1); } 如果你运行或调试(单步跟踪)一下上面程序,发现它真是挺神奇的,居然longjmp执行时,程序还能够返回到setjmp的执行点,程序正常退出。但是这就说明了上面的这个例程的没有问题吗?我们对这个程序小改一下,如下: int Sub_Func() { // 注意,这里改动了一点 int be_modify, jmpret; be_modify = 0; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( "Error 1\n"); break; case 2: printf( "Error 2\n"); break; case 3: printf( "Error 3\n"); break; default : printf( "Unknown Error"); break; } //注意这一语句,程序有条件地退出 if (be_modify==0) exit(0); } return jmpret; } void main( void ) { Sub_Func(); // 注意,虽然longjmp的调用是在setjmp之后,但是它超出了setjmp的作用范围。 longjmp(mark, 1); }
4、MSDN中还做了特别的说明,“在C+ +程序中,小心对setjmp和longjmp的使用,因为setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中,使用C++提供的异常处理机制将会更加安全。”虽然说C++能非常好的兼容C,但是这并非是100%的完全兼容。例如,这里就是一个很好的例子,在C++ 程序中,它不能很好地与setjmp和longjmp和平共处。在后面的一些文章中,有关专门讨论C++如何兼容支持C语言中的异常处理机制时,会做详细深入的研究,这里暂且跳过。
引用:http://www.blogjava.net/tinysun/archive/2010/08/06/328121.html?opt=admin
http://chenqiqing.blog.51cto.com/517955/108561