处理永远不会输入的 switch 情况的最合适方法是什么?
What's the most appropriate way to handle a switch's case that will never be entered?
以下是我的部分代码:
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
的任何值递归调用自身,除了 END_FLAG
.因此,可以说 launchModule
永远不会用输入值 END_FLAG
调用。尽管如此,case END_FLAG
存在于第一个 switch
语句块中,应该以某种方式进行处理。通常,在永远不会输入的 switch
语句中处理案例的适当方法是什么?
这里可以假设这些是调用 launchModule()
时的唯一实例。
鉴于永远不应输入它,适当的响应可能是抛出异常、断言或中止执行并显示适当的错误消息。
在这些之间进行选择可以 non-trivial。当您使用定义的 NDEBUG 进行编译时,断言将被禁用,这可能是您不想要的。否则,它会立即中止程序(不调用析构函数等)。当您想在调试时快速终止程序时,这往往使其最合适,但可能(例如)记录并继续在已发布的代码中执行。
如果有可能从此错误中恢复,则抛出异常是最合适的,尤其是对于像服务器代码这样的东西,无论发生什么其他情况都必须继续执行。
如果您确定这是一个真正致命的错误并且只有在出现可怕的错误时才会发生,并且尝试在那个时候继续执行可能会破坏数据,所以您想要尽可能快和吵闹地退出(特别是,你要确保防止析构函数 运行,因为它们可能会使糟糕的情况变得更糟)。
在此处给出的情况下,如果输入 switch 语句的这段代码,则代码内部存在明显问题。这至少表明您通常会在断言或自行中止之间做出选择。我倾向于后者,因为您可能不想在发布的代码中禁止这种行为。
以下是我的部分代码:
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
的任何值递归调用自身,除了 END_FLAG
.因此,可以说 launchModule
永远不会用输入值 END_FLAG
调用。尽管如此,case END_FLAG
存在于第一个 switch
语句块中,应该以某种方式进行处理。通常,在永远不会输入的 switch
语句中处理案例的适当方法是什么?
这里可以假设这些是调用 launchModule()
时的唯一实例。
鉴于永远不应输入它,适当的响应可能是抛出异常、断言或中止执行并显示适当的错误消息。
在这些之间进行选择可以 non-trivial。当您使用定义的 NDEBUG 进行编译时,断言将被禁用,这可能是您不想要的。否则,它会立即中止程序(不调用析构函数等)。当您想在调试时快速终止程序时,这往往使其最合适,但可能(例如)记录并继续在已发布的代码中执行。
如果有可能从此错误中恢复,则抛出异常是最合适的,尤其是对于像服务器代码这样的东西,无论发生什么其他情况都必须继续执行。
如果您确定这是一个真正致命的错误并且只有在出现可怕的错误时才会发生,并且尝试在那个时候继续执行可能会破坏数据,所以您想要尽可能快和吵闹地退出(特别是,你要确保防止析构函数 运行,因为它们可能会使糟糕的情况变得更糟)。
在此处给出的情况下,如果输入 switch 语句的这段代码,则代码内部存在明显问题。这至少表明您通常会在断言或自行中止之间做出选择。我倾向于后者,因为您可能不想在发布的代码中禁止这种行为。