user-0 提问: 一个函数内，调用多个其他函数出错，怎么退出

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-2
content: 还是喜欢do{}while(0);资源好释放些

user: user-3
content: c++的异常机制不是很好， 只能捕捉到自定义异常， 但是对系统异常没法捕捉（例如内存越界，野指针等） 所以， 好好用goto ，return， do..while();  出口多不是问题， 关键你要控制好逻辑， 定义自己的错误码等

user: user-4
content: 是否可以添加打印信息，用于标注在哪个途径或者处理哪个函数里除了异常，然后直接调用exit退出程序。

user: user-5
content: 可以 if else嵌套啊  如：  if （fun1 == xxx） {     if (fun2 == xxx)     {          //....     }     else     {     } } else { }

user: user-6
content: 引用 2 楼 mylove94U 的回复:[quote=引用 楼主 mylove94U 的回复:] 各位好，我在一个函数中，调用多个函数，每个函数都可能出错，都需要进行判断，如果出错就退出程序，除了用do...while(0), goto语句外，还有什么好的方法呢。      do     {         queryCertStaus(status, certNo);         if(strncmp(status, ERR_CERT_ACTIVE,  2) != 0)         {             strcpy(retCode, status);             break; 	    //goto err;         }          if((pkLen = getPkFromDb(pkStr, certNo, identity)) == -1)         {             strcpy(retCode, ERR_NO_CERT);             break; 	    //goto err;         }          Base64Decode((unsigned char*)buf, &bufLen, signText);         sha1HMAC(hmac, (unsigned char*)buf, bufLen);  //对明文计算哈希          //公钥对哈希值进行加密         if (0 != (ret = RSA_PKEncrypt(tmp, &tmpLen, (unsigned char*)hmac, 20, (unsigned char*)pkStr, pkLen)))         {             trace_log(ERR, "RSA_PKEncrypt failure. Error message: %s", RSA_LastError(ret));             strcpy(retCode, ERR_SIGN_FAILURE);             break; 	    //goto err;         }          signLen = sizeof(signMsg);         Base64Encode(signMsg, &signLen, tmp, tmpLen);         flag = true;     }while(0); 引用 1 楼 cjqpker 的回复:如果不介意性能的话，可以抛异常 另外，处理好资源释放问题，可以随时return  嗯，return语句多了，感觉阅读起来有点费劲，出口有点多。[/quote]  所以才有 do while(0) 的方法出现。这个方法在统一出口、控制分支、清理资源方面，还是很有优势的，虽然看起来丑了点

user: user-0
content: 引用 楼主 mylove94U 的回复:各位好，我在一个函数中，调用多个函数，每个函数都可能出错，都需要进行判断，如果出错就退出程序，除了用do...while(0), goto语句外，还有什么好的方法呢。      do     {         queryCertStaus(status, certNo);         if(strncmp(status, ERR_CERT_ACTIVE,  2) != 0)         {             strcpy(retCode, status);             break; 	    //goto err;         }          if((pkLen = getPkFromDb(pkStr, certNo, identity)) == -1)         {             strcpy(retCode, ERR_NO_CERT);             break; 	    //goto err;         }          Base64Decode((unsigned char*)buf, &bufLen, signText);         sha1HMAC(hmac, (unsigned char*)buf, bufLen);  //对明文计算哈希          //公钥对哈希值进行加密         if (0 != (ret = RSA_PKEncrypt(tmp, &tmpLen, (unsigned char*)hmac, 20, (unsigned char*)pkStr, pkLen)))         {             trace_log(ERR, "RSA_PKEncrypt failure. Error message: %s", RSA_LastError(ret));             strcpy(retCode, ERR_SIGN_FAILURE);             break; 	    //goto err;         }          signLen = sizeof(signMsg);         Base64Encode(signMsg, &signLen, tmp, tmpLen);         flag = true;     }while(0); 引用 1 楼 cjqpker 的回复:如果不介意性能的话，可以抛异常 另外，处理好资源释放问题，可以随时return  嗯，return语句多了，感觉阅读起来有点费劲，出口有点多。

user: user-6
content: 如果不介意性能的话，可以抛异常 另外，处理好资源释放问题，可以随时return