6

我正在寻找关于使用std::logic_error而不是使用复杂的嵌套 if/elseif 返回 true/false 列表的意见。

我想从很多类似的功能中移出,如下所示

bool validate_data(){
    std::vector<int> v; 
    //fill with data
    if( v.find(10) == v.end() ){
       return false;
    } 
    // other checks that return false
}

bool validate_data(){
    std::vector<int> v; 
    //fill with data
    if( v.find(10) == v.end() ){
       throw std::logic_error("error message");
    } 
    // other checks that return false
}

并在一个try-catch块中调用所有这些函数列表。

因为它是一个派生的,std::exception我可能不知道这是否是一个好主意。

有人像下面的例子那样使用吗?

非常感谢

AFG

4

3 回答 3

5

仅在异常情况下使用异常。

发现值 10 不是例外情况吗?还是只是正常情况?

将您的方法从 validate_data 重命名为 is_data_valid 会更清晰。如果该方法返回 true,则它是有效的。如果它返回 false,则不是。无需为此使用异常。

于 2012-05-15T13:04:57.077 回答
5

您应该只在特殊情况下使用例外。当返回值是真或假的可能性不小时,使用(和检查)返回值的效率要高得多。只有当抛出的可能性小到超过返回值检查的成本时,异常才会更有效率。

因此,如果无效数据的可能性非常低,那么就例外。否则,当前的解决方案不仅应该很好,而且效率也稍高一些(因为投掷和处理相对昂贵)。

于 2012-05-15T13:06:16.013 回答
3

由于调用了您的函数,因此validate_data()我只会在函数中存在任何内部错误并使用trueorfalse表示该函数确实验证了输入,但它是valid( return true) 或无效 ( return false) 时才抛出异常。

这不会阻止您使用多个if() else if() else构造,但它会使代码更清晰,更容易区分数据是否无效或发生内部错误。

try {
  bool valid = validate_data(foo);
  /* process data or break if invalid */
} catch (std::exception &ex) {
  /* internal error happened */
}

如您所见,它会使您的代码更长,恕我直言,更干净。

于 2012-05-15T13:03:51.223 回答