将错误处理添加到加载数据的函数(但有时还需要使用默认值)

Adding error handling to a function that loads data (but also needs to use default values sometimes)

本文关键字:默认值 添加 处理 错误 加载 函数 数据      更新时间:2023-10-16

我正在尝试找到一种非笨拙的方式,将错误处理介绍到从数据源加载数据的函数中。障碍是数据源可能(或可能不)包含无效的数据,并且如果值无法解析值,则根据数据源的"修订",应使用默认值或应生成错误:

class Foo {
    int value_1;
    int value_2;
    //...
    void loadDataFromSource(DataSource source)
    {
        int revision = source.getRevision();
        value_1 = source.parseValue(1);
        value_2 = source.parseValue(2);
        //...
    }
}

函数" parsevalue()"当前返回默认值如果无法解析,但是如上所述,需要介绍错误处理。我可以让" parsevalue()"投掷异常并处理它们(取决于数据源修订),例如

void loadDataFromSource_NewRevision(DataSource source)
{
    //Exceptions thrown by parseValue() are handled by the caller of this function
    value_1 = source.parseValue(1);
    value_2 = source.parseValue(2);
    //...
}
void loadDataFromSource_OldRevision(DataSource source)
{
    //Exceptions thrown by parseValue() are discarded and default values are used
    try { value_1 = source.parseValue(1); }
    catch(...) { value_1 = 42; }
    try { value_2 = source.parseValue(2); }
    catch(...) { value_2 = -7; }
    //...
}

但是代码重复和整个设置感觉很糟糕。使用某种标志告诉parsevalue()投掷/不示例。

也是如此。
void loadDataFromSource(DataSource source)
{
    int revision = source.getRevision();
    bool useDefaultValueOnError = revision < 10;
    //Exceptions thrown by parseValue() - if any - are handled by the caller of this function
    value_1 = source.parseValue(1, useDefaultValueOnError, 42);
    value_2 = source.parseValue(2, useDefaultValueOnError, -7);
    //...
}

我想避免代码重复,但是"标志"选项看起来同样没有吸引力。有人知道这样做的更好方法吗?

编辑/小更新:我设法减少了值的数量,我们需要使用一个默认值(如果它在数据源的旧修订中未解析)为少数。对于那些我创建了第二个使用参数的" ParseValueWithDefault"功能,并且使用"使用默认的eRror"标志,该标志调用原始解析功能,捕获错误并返回默认值或重新返回异常。不是完美的,但我觉得这是目前最不糟糕的选择。

int parseValueWithDefault(int valueId, int defaultValue, bool useDefaultOnError)
{
    try 
    {
        return source.parseValue(valueId);
    }
    catch (Exception& e)
    {
        if (useDefaultOnError)
            return defaultValue;
        throw;
    }
}

建议:

假设提供的代码片段包含与可用的相同信息,则有几种方法可以从旧修订中构建,但这取决于每种情况下可能会抛出的例外,或者如果您这样做任何例外。这个答案仅仅是关于错误处理件而不是处理值。

void loadDataFromSource_OldRevision(DataSource source)
{
    //Exceptions thrown by parseValue() are discarded and default values are used
    try { value_1 = source.parseValue(1); }
    catch(...) { value_1 = 42; }
    try { value_2 = source.parseValue(2); }
    catch(...) { value_2 = -7; }
    //...
}

假设您知道例外,则有几个选择。如果您有不同的例外,则可以在两个捕获语句中直接指定它们(如下所示;简化命名仅用于解释,您可以搜索特定的异常)。

try{
    // parse value
} catch (SomeOldException ex) {
    // give default
} catch (SomeNewException ex) {
    // throw exception
}

对于使用多个值,您可以按照您决定的方式进行收集和迭代。

如果两个修订都引发了相同的错误,或者您需要例外以始终是" catch all"异常(...),那么您可以使用数据源中似乎可用的修订(如下所示))。

try{
    // parse value
} catch (...) {
    // check the revision number
    //throw exception or provide default value respectively

希望这会有所帮助。和其他人,请随时在您认为合适的地方进行编辑。这已经有一段时间了,因为我定期使用C 。

还有其他一些选项,但是在我真正谈论它们作为答案之前,我还需要在C 中进行一些复习。随着您获得更多的修订/默认价值更正,研究其他一些在其他语言中也有益的概念可能是有益的。例如,抽象类,依赖注入或任何有助于分离对象中关注点的东西。