如何通过返回类型为int的函数返回错误

时间:2016-01-10 02:34:17

标签: c++ return

我有一个函数可以读取文件并返回文件中数字的总和。我正在检查文件是否存在。如果它不存在,我将返回1.但我的问题是我的函数的返回值,计算sum是int。因此,如果它无法打开文件,则返回1作为总和,而我希望它返回1作为错误指示符而不是总和。

onProgressUpdate(String... values){
//todo
}

3 个答案:

答案 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)

返回一个魔术值来表示出错的地方是不是最理想的,因为文件中元素的总和可以是任何值,并且巧合就是这个相同的魔法值。

有以下可能性表明出现了问题

  1. 使用例外。这降低了危险,用户将忽略该问题。但有时文件不存在是“正常”的,所以人们不想抛出异常,因为它毕竟不是那么特别。
  2. 使用boost::optional或自制结构,其中包含结果旁边的错误代码作为返回值。但是错误代码更容易被忽视作为例外。
  3. 使用专用的错误标志int sum(string filename, int &errorFlag),这种方法的主要问题是它在调用sum之前使用错误标志的初始化来填充代码,这使得它更难理解。
  4. 将错误代码存储在全局变量中,可以在调用sum后查询该变量。但你可以非常肯定,没有人会检查这个值,因为这些天没有人阅读文档。