You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:48:03