处理Java中的非致命错误

时间:2014-10-25 15:34:36

标签: java error-handling

我编写了一个程序来帮助用户配置游戏的机会。我正在处理加载用户保存的数据。这些数据可能(有时会)部分损坏(由于我身边的错误或游戏数据/规则从上游的变化)。

我需要能够尽可能地处理这种损坏并加载。更具体地说,保存文件的内容在语法上是正确的,但在语义上是破坏的。我可以安全地解析文件并删除任何非语义上的条目。

目前,我的数据解析器只会显示一个带有相应警告消息的模态对话框。但是,显示警告不是解析器的工作,我正在寻找将此信息传递给调用者的方法。

一些代码可以显示正在发生的事情(实际上还有比这更多的事情,但这突出了问题):

class Parser{
    public void parse(XMLNode aNode){
        ...
        if(corrupted) {
            JOptionPane.showMessageDialog(null, "Corrupted data found", 
                "error!", JOptionPane.WARNING_MESSAGE);
            // Keep calm and carry on
        }
    }
}

class UserData{
    static UserData loadFromFile(File aFile){
        UserData data = new UserData();
        Parser parser = new Parser();
        XMLDoc doc = fromXml(aFile);
        for(XMLNode entry : doc.allEntries()){
            data.append(parser.parse(entry));
        }
        return data;
    }
}

这里的问题是,IOException或XML中的语法错误,loadFromFile将始终成功加载某些内容,这是想要的行为。不知何故,我只需要传递调用者出错的信息(如果有的话)。我可以返回Pair<UserData,String>,但这看起来并不漂亮。在这种情况下抛出异常显然不起作用。

有没有人对如何解决这个问题有任何想法?

1 个答案:

答案 0 :(得分:1)

根据您要表示的内容,您可以使用类,例如SQLWarning包中的java.sql。如果您有java.sql.Statement并致电executeQuery,则会获得java.sql.ResultSet,然后您可以直接在结果集上调用getWarnings,甚至可以在语句本身上调用{\ n}。

您可以RefUpdate.Result项目使用枚举,例如JGit。如果您有org.eclipse.jgit.api.Git,则可以创建一个FetchCommand,它会为您提供FetchResult,它将为您提供TrackingRefUpdates的集合,每个集合包含一个RefUpdate.Result FAST_FORWARD FORCED IO_FAILURE LOCK_FAILURE NEW NO_CHANGE NOT_ATTEMPTED REJECTED REJECTED_CURRENT_BRANCH RENAMED 枚举,可以是以下之一:

class UserData {
    public boolean isCorrupt();
}

在您的情况下,您甚至可以使用布尔标志

UserDataReader

但是既然你提到实际上还有更多的事情发生,那真的取决于你的#34;腐败&#34;的模式。但是, 如果您有{{1}}可以实例化,而不是静态实用工具方法,则可能会有更多选项