在Java中处理非致命错误

在Java中处理非致命错误,java,error-handling,Java,Error Handling,我已经编写了一个程序来帮助用户配置游戏的机械装置。我正在处理加载用户保存的数据。这些数据可能(有时确实)部分损坏(可能是由于我这边的错误,也可能是由于上游游戏数据/规则的更改) 我需要能够处理这种腐败和负载尽可能多。更具体地说,保存文件的内容在语法上是正确的,但在语义上是损坏的。我可以安全地解析文件并删除任何语义上不正确的条目 目前,我的数据解析器只会显示一个带有适当警告消息的模式对话框。但是,显示警告不是解析器的工作,我正在寻找一种将此信息传递给调用方的方法 一些代码可以大致显示正在发生的事情

我已经编写了一个程序来帮助用户配置游戏的机械装置。我正在处理加载用户保存的数据。这些数据可能(有时确实)部分损坏(可能是由于我这边的错误,也可能是由于上游游戏数据/规则的更改)

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

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

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

这里的问题是,除非XML中出现
IOException
或语法错误,
loadFromFile
将始终成功加载某些内容,这是所需的行为。不知何故,我只需要把出了什么问题的信息传递给打电话的人。我可以返回一个
,但这看起来不太漂亮。在这种情况下,抛出异常显然不起作用


有人对如何解决这个问题有什么想法吗?

根据您试图表示的内容,您可以使用一个类,如包中的类。当您有一个
java.sql.Statement
并调用
executeQuery
时,您会得到一个
java.sql.ResultSet
,然后您可以直接对结果集调用
getWarnings
,甚至对语句本身也可以

您可以使用项目中的枚举。当您有一个
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
,而不是静态实用程序方法,您可能会有更多的选项。

“在这种情况下,抛出异常显然不起作用。”
--为什么这么说,因为这可能正是您应该做的。您可以为特定异常创建自己的自定义异常类,将调用代码所需的密钥信息传递到异常中,并在catch块中处理异常并通知用户。也许我看错了你的问题,但这似乎正是异常的用途——将异常事件的信息传递给程序中能够处理异常事件的地方,然后通知用户。因为这意味着我不会获得部分加载的用户数据,如果我抛出这些数据,这些数据仍然是有价值的。用户数据将在加载过程中被强制规范化,因此从技术上讲不会再被损坏。但用户需要知道哪些条目已修复,以便手动查看。我本想返回一个带有结果和警告的类,但认为它似乎有点设计过度。我还考虑了一个
ErrorReporter
类型的接口来传递给load调用。它是否被过度设计取决于调用方需要知道什么。如果只是一个“是”或“否”的问题,那就带着国旗走吧。如果是离散结果,请使用枚举。如果调用者需要的不止这些,结果类可以使您的意图更清楚。但是<代码> ErrorReporter 听起来像是只有当警告需要作为事件广播时才需要的。它可以是任意数量的离散警告。鉴于你所说的数据在技术上不再是腐败的,你可以考虑在<代码> USEDATABAS<代码> < <代码>列表>代码>。如果您试图做的是向来电者显示已修复的内容,而不是需要修复的内容
DataCorrection
可以包含损坏字段的名称和旧值。
class UserData {
    public boolean isCorrupt();
}