问题描述
|
我有一个管理磁盘上文件的类,以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);
}
}
您是否同意此解决方案,请在简单性和正确性之间进行权衡?
我很幸运,因为我找到了一个合适的例外。如果不是,则必须定义自己的异常,因为使用Exception类并不是很好的设计。 (导致调用方捕获Exception,也隐式捕获RuntimeException)。
运行时异常在RuntimeException类中具有一个共同的祖先,而所有检查的异常都没有,这是异常结构中的异常吗?
解决方法
1)我同意你的观点,并且倾向于这样做:大多数情况下,手动保留许多异常类型是没有用的。在应用程序的更高级别上,您所需要的就是足够的精度,以能够向用户提供有意义的错误。在您的情况下,“无法读取文件”,因此IOException是可以的。
2)是的,这是Java中的Exception机制的一个长期存在的缺陷……甚至有人说Java中的Exceptions机制在其根源上是有缺陷的(大多数时候滥用已检查的异常)。无论如何,我有时都使用包罗万象的InvalidStateException或IllegalArgumentException。当然,如果您需要将更精确的含义传达给应用程序的上层,则始终可以创建自己的异常。但是请记住:吻:)