switch()中未处理的枚举类值 - 异常或断言?

时间:2016-05-09 09:48:20

标签: c++ exception switch-statement assert enum-class

lvlenum class

switch(lvl)
{
case LogLevel::Trace:
    return "Trace";
case LogLevel::Debug:
    return "Debug";
case LogLevel::Info:
    return "Info";
case LogLevel::Warning:
    return "Warning";
case LogLevel::Error:
    return "Error";
case LogLevel::Fatal:
    return "Fatal";
default:
    assert(0 && "Unhandled LogLevel in LevelToStr"); return "???";      // This one?
    throw std::invalid_argument( "Unhandled LogLevel in LevelToStr" );  // or this one?
}

共识是default应该存在,但related question中的意见在它应该做的事情上存在分歧。崩溃整个事情?崩溃当前线程?尝试优雅地处理异常?

双方在评论中提出了一些论点,但讨论并不十分明确。

有人可以提供一个应该使用的综合答案,或者在哪些条件下?

1 个答案:

答案 0 :(得分:2)

完全取决于系统的要求。

我实际上认为在这种情况下最好不要使用T。如果你把它遗漏了,如果你在编译时错过了一个案例,你会得到一个有用的警告。如果使用-Werror进行编译,那么在修复警告之前,程序将无法编译。

default: