什么放在交换机的默认标签中?

Tre*_*key 10 c++ assert default switch-statement

假设我有一个枚举.

enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
Run Code Online (Sandbox Code Playgroud)

后来我有这样的功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

虽然永远不应该执行默认标签,但我想说明如果程序员在"ShapeName"中添加另一个值并且在交换机中没有考虑到可能会出现的错误.
你会建议我做什么?

1.断言
我可以使用断言,但我断言的是什么?

assert(false); //?
Run Code Online (Sandbox Code Playgroud)

2.例外
我可以抛出异常,但我认为这不是一个很好的做法.我的印象是异常是针对某些环境无法预测的运行时事件.

3.退出
我可以立即退出程序并出错.这感觉就像最好的主意,但我不确定这是不错的做法.我认为断言的优点是,当你准备好运送程序时,你可以将它们全部关掉.然后,所有断言代码将不再存在.


也许还有另一种我不知道的方式.我确实使用了一个编译器标志来警告未计入的值,但我仍然想知道别人推荐的是什么.

chr*_*ris 9

我喜欢用信息性的信息断言的想法.试试这个:

assert (!"The default case of so-so switch was reached.");
Run Code Online (Sandbox Code Playgroud)

这始终返回false,但会提供您可以使用的消息.

编辑:
我找到了源头,我把这个概念从我的记忆中拉出来; 它出现在下面的书中:
C++编码标准 - 101规则和指南

  • 并且请记住,断言通常会从"发布"版本中删除. (3认同)
  • 或者,如果你不喜欢拼写的方式,`assert(false &&"message");` (2认同)