怎么样从被调函数结束全部流程,但又使程序不退出
如:“程序1”的程序界面“按钮1”, 会调用很多函数,函数里又调用一些函数。其中某个(子)被调函数 需要进行条件判断。不满足就需要结束“按钮1”的功能,而不是结束整个“程序1”。
return 会返回到上层函数继续运行。exit()又会退出整个程序进程(假如还有其他线程或窗口界面就糟了)
上一层函数,虽然可以用 被调函数 return 的返回值 来进行判断 能否也跟着return。
但是个人认为这样,假如主函数分支非常多的时候。每一层都要设置个return的值,并对返回值做判断。非常麻烦!
有没有什么办法能让被调函数自身来结束这一切(当然不能启动线程和强制终止线程)
如:“程序1”的程序界面“按钮1”, 会调用很多函数,函数里又调用一些函数。其中某个(子)被调函数 需要进行条件判断。不满足就需要结束“按钮1”的功能,而不是结束整个“程序1”。
return 会返回到上层函数继续运行。exit()又会退出整个程序进程(假如还有其他线程或窗口界面就糟了)
上一层函数,虽然可以用 被调函数 return 的返回值 来进行判断 能否也跟着return。
但是个人认为这样,假如主函数分支非常多的时候。每一层都要设置个return的值,并对返回值做判断。非常麻烦!
有没有什么办法能让被调函数自身来结束这一切(当然不能启动线程和强制终止线程)
解决方案
20
可以抛出一个异常,然后在希望退到的那个函数里捕获这个异常
20
仅供参考:
#include <iostream> using namespace std; struct MyStruct { int Nodedata; MyStruct *pLeft; MyStruct *pRight; } s1,s2,s3,s4,s5,s6,s7,s8; void ashow(MyStruct * p) { if (p != nullptr) { ashow(p->pLeft); ashow(p->pRight); cout << p->Nodedata << endl; if (p->Nodedata == 4) { throw 1;//退出递归.直接返回. } } } int main() { MyStruct *pRoot;//根 pRoot = &s1; s1.Nodedata = 1; s2.Nodedata = 2; s3.Nodedata = 3; s4.Nodedata = 4; s5.Nodedata = 5; s6.Nodedata = 6; s7.Nodedata = 7; s8.Nodedata = 8; s1.pLeft = &s2; s1.pRight = &s3; s2.pLeft = &s4; s2.pRight = &s5; s3.pLeft = &s6; s3.pRight = &s7; try { ashow(pRoot); } catch (int err) { cout<<"catch err "<<err<<endl; } return 0; } //4 //catch err 1 //
再供参考:
#include <stdio.h> #include <setjmp.h> jmp_buf mark; int i=0; void c() { printf( "c in\n"); if (1==i%2) longjmp( mark, i ); printf( "c out\n"); } void b() { printf( "b in\n"); c(); printf( "b out\n"); } void a() { printf( "a in\n"); b(); printf( "a out\n"); } void main( void ) { int jmpret; jmpret = setjmp( mark ); printf( "Start %d\n",jmpret); if( jmpret == 0 ) { printf( "First\n"); a(); i++; a(); } else { printf( "Second\n"); } } //Start 0 //First //a in //b in //c in //c out //b out //a out //a in //b in //c in //Start 1 //Second //