Допустим, у меня есть перечисление.
enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
и позже у меня есть подобная функция:
void Function (ShapeName const shape){
switch (shape){
case ShapeName::TRIANGLE:
DoSomething1();
break;
case ShapeName::CIRCLE:
DoSomething2();
break;
case ShapeName::SQUARE:
DoSomething3();
break;
default:
//THIS CODE BLOCK SHOULD NEVER BE EXECUTED!
}
return;
}
Хотя метка по умолчанию никогда не должна выполняться, я хочу учесть потенциальные ошибки, которые могут возникнуть, если программист добавит другое значение к 'ShapeName' и оно не учтено в выключатель.
Что бы вы порекомендовали мне сделать?
1. Утверждения
Я мог бы использовать утверждение, но что я утверждаю?
assert(false); //?
2. Исключения
Я мог бы создать исключение, но не думаю, что это было бы очень хорошей практикой. У меня сложилось впечатление, что исключения предназначены для событий времени выполнения, которые нельзя предсказать из-за определенных сред.
3. Выходы
Я могу просто сразу выйти из программы с ошибкой. Это кажется лучшей идеей, но я не уверен, что это хорошая практика. Я думал, что преимущество утверждений в том, что вы можете отключить их все, когда будете готовы отправить программу. Тогда весь этот код утверждений больше не будет существовать.
Может быть, есть другой способ, о котором я не знаю. Я использую флаг компилятора, который предупреждает о неучтенных значениях, но я все же хочу знать, что рекомендуют другие.