我正在寻找某人对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
答案 0 :(得分:5)
仅针对特殊情况使用例外。
没有发现价值10是一种特殊情况吗?或者这只是一种正常情况?
将您的方法从validate_data重命名为is_data_valid使其更清晰。如果方法返回true,则它是有效的。如果它返回false,则不是。不需要为此使用例外。
答案 1 :(得分:5)
您应该仅针对特殊情况使用例外情况。当真实或错误的可能性非常重要时,使用(和检查)返回值会更有效。只有当投掷的机会太小而不能超过回报价格检查的成本时,例外才会更有效。
因此,如果无效数据的可能性非常低,那么请使用例外。否则,目前的解决方案不仅应该很好,而且效率也要高一些(投掷和处理相对昂贵)。
答案 2 :(得分:2)
由于您的函数被调用validate_data()
,如果函数中存在任何内部错误,我只会抛出异常并使用true
或false
来指示函数确实验证了输入,但它是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 */
}
你可以看到它会让你的代码更长,恕我直言。