C++从子函数抛异常到main出现未处理异常如何解决
C++井字棋异常崩溃问题解决方法
问题根因
你代码中崩溃的核心原因是无操作数的throw语句只能在已经捕获到异常的catch块中使用,用于重新抛出当前捕获的异常,你在普通函数caseCheck中直接调用throw;属于非法用法,会触发系统未处理异常错误直接崩溃。
正确的异常方案修改
只需要把caseCheck里两处的throw;改为抛出任意合法值即可,你的main函数已经写了catch(...)捕获所有异常,只要抛出的是合法对象就可以被正常捕获,不会触发崩溃。
修改示例:
// O获胜分支 cout << endl << "player 2 wins"; throw 1; // 改为抛任意int值即可 // X获胜分支 cout << endl << "player 1 wins"; throw 2;
修改后异常会被main里的catch块捕获,正常执行return 0退出程序。
更合理的实现思路
C++异常设计初衷是处理程序运行时的意外错误,不建议用来做正常业务流程的控制,你可以用以下更常规的方案实现终止逻辑:
方案1:返回值逐层传递
将caseCheck改为返回bool类型,检测到获胜返回true,未获胜返回false,上层函数拿到返回值后逐层返回终止流程:
bool caseCheck() { if (/*O获胜条件*/) { system("cls"); mainBoard(); cout << endl << "player 2 wins"; return true; } if (/*X获胜条件*/) { system("cls"); mainBoard(); cout << endl << "player 1 wins"; return true; } return false; } // exes和oes函数开头判断返回值 void exes() { if (caseCheck()) { return; } // 原有逻辑省略 } // main循环里同步判断 int main() { for (int i = 0; i < 4; i++) { exes(); if (caseCheck()) break; oes(); if (caseCheck()) break; } // 平局逻辑省略 return 0; }
方案2:全局结束标志位
定义全局布尔变量bool gameOver = false;,检测到获胜时将gameOver设为true,所有函数执行前先判断该标志,为true直接返回,main循环也通过该标志判断是否终止。
方案3:直接调用exit函数
你之前说exit无法停止运行大概率是用法错误,exit(0)会直接终止整个进程,不存在停不下来的情况,你可以在获胜分支直接调用exit(0),无需抛出异常。
内容的提问来源于stack exchange,提问作者Pvt. Pancakes
相关产品推荐
相关产品推荐

