Обычно я ставлю что-то после переключателя, будь то throw something()
или return -1
.Вы должны убедиться, что во время выполнения вызов этой функции по крайней мере безопасен, что бы ни происходило.Ваш компилятор говорит вам об этом.
Пример:
enum class Test { a, b, c } ;
int foo(Test test) {
switch (test) {
case Test::a: return 0;
case Test::b: return 1;
case Test::c: return 2;
}
throw std::runtime_error("Unhandled Test enumerator " + std::to_string((int)test) + " in foo()");
}
В идеале ваши клиенты никогда не увидят этого, но, если они это сделают (посредством вашего верхнего уровня catch
- выесть, верно?), вы сразу же знаете, в чем проблема, и можете ее исправить.
Дополнительно (но не только) Я рассмотрю вопрос об отладке утверждения типа assert
(илипроектный эквивалент), так что эта ошибка обнаружена во время разработки.(Хотя в приведенном выше примере с try
это фактически предотвратит создание полезного сообщения об ошибке, поэтому это не всегда уместно.)
Также, если вы включите -Werror
, то не сможете добавить элементдо switch
, ваш проект не будет построен в любом случае, так что это решает проблему у источника (буквально!).
В общем, не игнорируйте и не пытайтесь подавлять предупреждения: обращайте внимание на них!