c++ - 处理永远不会输入的 switch 情况的最合适方法是什么?

标签 c++ switch-statement c++03 control-flow

以下是我的部分代码:

enum Mode {
    MAIN = 0,
    NUM_GEN,
    ARITH,
    MONEY,
    END_FLAG
}

int main() {
    launchModule(MAIN);

    return 0;
}

void launchModule(Mode mode) {
    ...
    getline(cin, input);
    choice = stoi(input);
    // More input validation

    switch (mode) {
    case MAIN:
        switch (static_cast<MODE>(choice)) {
        // Other cases: Recursively calls launchModule(choice)
        case END_FLAG:
            // Exits current function
            break;
        }
        break;
    // Other cases: no switch(Mode) happens
    case END_FLAG:
    // TODO: What goes here?
        break;
    }
    ...
    return;
}

如上所示,launchModule(mode) 首先由 main() 以输入 MAIN 调用,并且可以递归地调用自身Mode 的值 EXCEPT END_FLAG。因此,可以说 launchModule 永远不会用输入值 END_FLAG 调用。尽管如此,case END_FLAG 存在于第一个 switch 语句 block 中,应该以某种方式进行处理。通常,在永远不会输入的 switch 语句中处理情况的合适方法是什么?

这里可以假设这些是调用 launchModule() 时的唯一实例。

最佳答案

鉴于不应输入它,适当的响应可能是抛出异常、断言或中止执行并显示适当的错误消息。

在这些之间做出选择可能很重要。当您使用定义的 NDEBUG 进行编译时,断言将被禁用,这可能是您不想要的。否则,它会立即中止程序(不调用析构函数等)。当您想在调试时快速终止程序时,这往往使其最合适,但可能(例如)记录并继续在已发布的代码中执行。

如果有可能从此错误中恢复,则抛出异常是最合适的,特别是对于像服务器代码这样的东西,无论发生什么其他情况都必须继续执行。

如果您确定这是一个真正致命的错误,并且只有在出现严重错误时才会发生,并且尝试在该点继续执行可能会破坏数据,因此您希望退出,则中止往往是最合适的尽可能快速和嘈杂(特别是,您要确保不要运行析构函数,因为它们可能会使糟糕的情况变得更糟)。

在此处给出的情况下,如果输入 switch 语句的这一段,则代码内部存在明显问题。这至少表明您通常会在断言或自行中止之间做出选择。我倾向于后者,因为您可能不想在发布的代码中禁止这种行为。

关于c++ - 处理永远不会输入的 switch 情况的最合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34668745/

相关文章:

c++ - 在编译时检测或避免对临时文件的无效引用

c++ - 如何在从A继承B的同时从B继承类A?

c++ - 在实践中何时调用 move 构造函数?

c++ - 将简单的 Python 方法转换为 C++

c++ - 分形生成代码无法正常工作

c++ - switch 语句中的 C2196 错误

powershell 变量中的 IF 条件

C - 使用 while 和 switch/case 的菜单程序返回具有无效选择的重复菜单

c++ - 在 MSVC++ 中覆盖内存分配器

c++ - 如何在对象容器中搜索数据成员值?