Каков наиболее подходящий способ обработки корпуса коммутатора, который никогда не будет введен?

Вот некоторые части моего кода:

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() называется.

0

Решение

Учитывая, что его никогда не следует вводить, соответствующим ответом, вероятно, будет выбрасывание исключения, утверждение или прерывание выполнения с соответствующим сообщением об ошибке.

Выбор между ними может быть нетривиальным. Утверждение будет отключено, когда вы скомпилируете с определенным NDEBUG, который вам может не понадобиться. В противном случае он немедленно прерывает программу (без вызова деструкторов и т. Д.). Это делает его наиболее подходящим, когда вы хотите быстро убить программу при отладке, но можете (например) записать в журнал и продолжить выполнение в выпущенном коде.

Бросок исключения был бы наиболее уместным, если бы можно было восстановить эту ошибку, особенно для чего-то вроде серверного кода, который должен продолжать выполняться независимо от того, что еще происходит.

Прерывание имеет тенденцию быть наиболее подходящим, если вы уверены, что это действительно фатальная ошибка, которая может произойти только в том случае, если что-то пошло не так, и попытка продолжить выполнение в этот момент может привести к разрушению данных, поэтому вы хотите выйти так быстро и шумно насколько это возможно (в частности, вы хотите защититься от работы деструкторов, потому что они могут ухудшить ситуацию).

При указанных здесь обстоятельствах внутри кода возникает явная проблема, если вводится эта ветвь оператора switch. Это означает, что, по крайней мере, обычно вы выбираете между утверждением или прерыванием по своему усмотрению. Я бы склонялся к последнему, поскольку вы, вероятно, не хотите запрещать это поведение в выпущенном коде.

4

Другие решения

Других решений пока нет …