我有一个函数可以读取文件并返回文件中数字的总和。我正在检查文件是否存在。如果它不存在,我将返回1.但我的问题是我的函数的返回值,计算sum是int。因此,如果它无法打开文件,则返回1作为总和,而我希望它返回1作为错误指示符而不是总和。
onProgressUpdate(String... values){
//todo
}
答案 0 :(得分:5)
这实际上取决于有效输入(例如文件中的值)是什么,以及错误对程序的影响(例如,如果无法计算总和,程序是否可以合理地继续?)。
例如,如果您可以保证任何文件中的数据仅包含正值,您可以选择返回负值以指示错误(例如-1
表示打开文件时出现问题,{{ 1}}表示文件中的负值,-2
表示文件中值的总和大于-3
等中的值。)
不幸的是,如果文件中有任何一组值(正面和负面),那种“某些返回值有效,其他指示错误”则不起作用。例如,如果文件中可能只有int
的单个值,则显然1
不能用于报告错误。同样,如果存在正值和负值的混合,则没有特定值可以返回以指示错误。
在这种情况下,选项包括
函数仅返回错误指示符,并接受另一个参数来保存结果
1
函数返回一个包含两个值的数据结构
int DoSum(const std::string &file, int &sum)
{
/* return value of zero indicates a sum has been computed
other values indicate an error status
*/
}
函数返回一个总和,但会在错误
上抛出异常struct ReturnData
{
int sum;
int error_indicator;
};
struct ReturnData DoSum(const std::string &file)
{
}
前两种情况的优点是,如果错误对程序不重要,并且相应的缺点是调用者可能忘记检查是否发生了错误,则调用者不需要执行任何操作。
第三种情况的优点是,如果某些调用者(或调用者调用者等)没有捕获异常,程序将终止而不是继续处理错误数据。它的缺点是,如果错误条件不重要,则无论如何都要强制调用者捕获异常。
因此,一般来说,除非必须在程序要继续执行时纠正错误条件的原因,否则不应抛出异常。
答案 1 :(得分:2)
如果您要使用返回值来提供结果并且表示错误,则必须选择不重叠的值。如果1是有效总和,则无法使用1来指示错误。这是发明例外的原因之一。一个例外可能被误认为是有效的结果。
答案 2 :(得分:0)
返回一个魔术值来表示出错的地方是不是最理想的,因为文件中元素的总和可以是任何值,并且巧合就是这个相同的魔法值。
有以下可能性表明出现了问题
int sum(string filename, int &errorFlag)
,这种方法的主要问题是它在调用sum之前使用错误标志的初始化来填充代码,这使得它更难理解。sum
后查询该变量。但你可以非常肯定,没有人会检查这个值,因为这些天没有人阅读文档。