【问题标题】:Handle exception in between loading and displaying data处理加载和显示数据之间的异常
【发布时间】:2015-05-22 22:04:00
【问题描述】:

我遇到了这种情况,不知道如何最好地处理它。输入将不胜感激。想象一下我有这样的方法:

void loaddata()
{
    try
    {
        // EXTRA: I also want to skip below SaveSomething if there was exeption
        // last time I called DecryptAndloadXMLdata. This may happen
        // if user calls loaddata twice. This is exaclty similar situation
        // as app quitting just it happens is user calls loaddata twice
        // and during first call there was exception say with DecryptAndloadXMLdata
        Savesomething(listOfObjects, xmlPath);//save old data first
        xmlPath = newValue;

        // some operations

        xmlDoc = DecryptAndloadXMLdata(xmlPath);

        // some other operations- populate List with data from above XML file
        listOfObjects.Add(objectFromXML);
        // Here also possibly modify contents of listOfObjects elements
    }
    catch(Exception ex)
    {
        xlmPath="";
    }
}

现在问题是当应用程序退出时我有这样的功能 自动保存上面填充的 List 对象 方法到文件。喜欢:

void whenAppisQuitting()
{
    Savesomething(listOfObjects, xmlPath);
}

但问题是。想象一下xmlDoc = loadXMLdata(); 抛出上述方法。将会发生的是我提到的列表不会被填充,并且当应用程序退出空元素(例如空的listOfObjects)时将被写入xmlPath - 从而损坏我的原始文件,因为有不相关的异常说由于加密loadXMLData 方法。

我希望我已经把我的问题说清楚了。处理这种情况的方法是什么?例如,我所做的你可以看到我在catch 中将xmlPath 设置为空-因此,如果出现任何异常,我认为数据未成功加载-因此现在在应用程序退出时我可以保持冷静,因为不会将任何内容写入文件因为它的xmlPath =""。解决这个问题的方法合理吗?

有点困惑,因为这类问题现在将错误处理提升到不同的级别 - 我需要考虑所有可能的故障类型?

【问题讨论】:

    标签: c# exception-handling


    【解决方案1】:

    遇到这种情况有什么办法?

    我会设置一个标志,指示解析时出现错误。将路径设置为 string.Empty 可能会导致混淆 (IMO)。也许一个空字符串可能是传递给您的方法的可能值。

    catch(Exception ex)
    {
        // Log
        IsParsingSuccessful = false;
    }
    

    当你想写的时候看看那个标志:

    void AppIsQuitting()
    {
        if (IsParsingSuccessful)
        {
            SaveSomething(listOfObjects, xmlPath);
        }
    }
    

    【讨论】:

    • 我认为你的观点很好。还有一件事。您可以看到,即使没有应用程序退出,我也可以调用 SaveSomething - 在 LoadDecryptXML 调用之前的 loaddata 方法中。现在,如果之前对 LoadDecryptXML 的调用出现异常 - 类似于应用程序退出示例,我不希望 SaveSomething 发生在 loaddata 方法中......现在如何/在哪里设置标志?
    • 所以这种方式基本上即使在 loaddata 调用之间存在 single 异常 - 我需要考虑操作无效并取消所有未来的写入
    • 你可以在调用Save之前检查IsParsingSuccessful,或者你可以让Save检查标志。
    • 该标志表示解析最新的值。如果失败,所有方法都应该知道它。您可以将其包装在某种ValidateParsing 方法中,每个方法在执行操作之前都会调用该方法。
    • @Yuval Itzchakov:嗯,好吧,所以基本上我也会将该检查放在 loaddata() 方法中,对吧?在调用 Save 之前?
    【解决方案2】:

    作为一般指导,您可能永远不应该在没有用户明确意图的情况下覆盖文件。

    至于您的错误处理,请使用简单的标志/布尔值来指示有效行为。仅在处理完所有内容后将该标志设置为 true,并且仅当该标志为 true 时,将内容保存到文件中。

    【讨论】:

    • 是的,就我而言,基本上我也有标志,但 xmlPath 充当标志对吗?如果它是空的,我不会写任何东西到文件中。你是这个意思吗?您将在哪里/如何将这些标志放在上面的代码中?另一个棘手的事情是在加载和解密该文件之前 - 我在它之前有代码来保存旧文件 - 所以如果我使用标志 - 那一刻它会被设置为 false,因此旧文件也不会被保存
    • 使用xmlPath 作为你的标志会起作用,但有它的缺点。如果您想稍后重试,则会丢失该值,并且它使代码的可读性低于名为 IsDataValid 的变量。
    • 如果我想稍后重试,为什么会失去价值?
    • 因为您已将其设置为空字符串...假设您从用户输入中获得了路径,并且您想每分钟自动重试一次。如果您清除变量,您将无法在不再次询问用户路径的情况下执行此操作。
    • 路径来自OpenFileDialog
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多