std :: logic_error而不是return false

时间:2012-05-15 12:46:36

标签: c++ exception-handling validation

我正在寻找某人对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

3 个答案:

答案 0 :(得分:5)

仅针对特殊情况使用例外。

没有发现价值10是一种特殊情况吗?或者这只是一种正常情况?

将您的方法从validate_data重命名为is_data_valid使其更清晰。如果方法返回true,则它是有效的。如果它返回false,则不是。不需要为此使用例外。

答案 1 :(得分:5)

您应该仅针对特殊情况使用例外情况。当真实或错误的可能性非常重要时,使用(和检查)返回值会更有效。只有当投掷的机会太小而不能超过回报价格检查的成本时,例外才会更有效。

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

答案 2 :(得分:2)

由于您的函数被调用validate_data(),如果函数中存在任何内部错误,我只会抛出异常并使用truefalse来指示函数确实验证了输入,但它是validreturn 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 */
}

你可以看到它会让你的代码更长,恕我直言。