Что указать в метке переключателя по умолчанию?

Допустим, у меня есть перечисление.

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. Выходы
Я могу просто сразу выйти из программы с ошибкой. Это кажется лучшей идеей, но я не уверен, что это хорошая практика. Я думал, что преимущество утверждений в том, что вы можете отключить их все, когда будете готовы отправить программу. Тогда весь этот код утверждений больше не будет существовать.


Может быть, есть другой способ, о котором я не знаю. Я использую флаг компилятора, который предупреждает о неучтенных значениях, но я все же хочу знать, что рекомендуют другие.

10
задан R. Martinho Fernandes 30 April 2012 в 00:35
поделиться