1

我有一个类管理磁盘上的文件,以 xml 的形式保存报告。由于它使用 JAXB(但可以使用任何其他 xml 库,这不相关),它可以生成 jaxb(或任何其他 xml 库)检查异常。
为了保持封装,我应该在我的库的逻辑级别“转换”我的原始库异常。但我不想过多地增加相关性很少、相关性差的课程的数量。由于该类与文件相关,因此我认为 IOException 足以应付这种情况。

public void save(File file) throws IOException {
    try{
        JAXBContext jc = JAXBContext.newInstance(ArchiveInfo.class);
        Marshaller m = jc.createMarshaller();
        m.marshal(this, file);
    } catch (JAXBException jexc) {
        throw new IOException(jexc);
    }
}
  1. 您是否同意此解决方案,是否在简单性和正确性之间进行了很好的权衡?
  2. 我很幸运,因为我找到了一个合适的例外。如果我不是,我一定会定义我自己的异常,因为使用 Exception 类不是好的设计。(导致调用者捕获异常,也隐式捕获 RuntimeException)。运行时异常在 RuntimeException 类中具有共同的祖先,而所有已检查的异常都没有,这不是异常结构中的异常吗?
4

1 回答 1

2

1)我同意你的观点并且倾向于这样做:手动保留大量异常类型在大多数情况下是无用的。在应用程序的更高级别,您所需要的只是足够的精度,以便能够为用户提供有意义的错误。在您的情况下,“无法读取文件”,因此 IOException 是可以的。

2) 是的,它是 Java 中异常机制的一个长期记录的缺陷......有些人甚至会说 Java 中的异常机制从根本上是有缺陷的(检查的异常大部分时间都被滥用)。无论如何,在你的情况下,我有时会使用包罗万象的 InvalidStateException 或 IllegalArgumentException。当然,如果您需要将更精确的含义传达给应用程序的上层,您始终可以创建自己的异常。但请记住:亲吻 :)

于 2011-05-30T15:55:54.220 回答