我正在阅读别人写的代码。未经检查的异常和已检查的异常都是自定义异常。我看到在方法中抛出了一个未经检查的异常,它被包装到catch子句中的checked异常中并再次抛出。将未经检查的异常包装到已检查的异常中是一种常见做法吗?如果是的话,为什么我们这样做?
答案 0 :(得分:3)
自定义未经检查的例外是"leaky abstractions."
的罪魁祸首应用程序可能会为其所依赖的服务定义接口。如果实现抛出应用程序要特定处理的特定于实现的未经检查的异常,则它会受到特定于实现的异常类型的污染。如果更换实现,这会导致维护问题。
为避免此问题,未经检查的异常可能会包含在接口定义的实现中性检查异常中。
作为一个具体示例,请考虑Hibernate使用未经检查的异常来通知调用者违反约束。假设您有一个User
实体,并且用户名在数据库中定义了唯一约束。您希望通过提示用户输入其他名称来特别处理此情况。如果Hibernate的ConstraintViolationException
在堆栈中传播不变,则应用程序将需要特定于Hibernate的处理程序。另一方面,如果数据访问层将其包装在合适的自定义检查异常中,则用新的ORM实现替换Hibernate将不需要在实现层之外进行任何更改。
答案 1 :(得分:1)
如果你在方法meth
中这样做,可能是因为代码调用了
meth
只需了解并检查已检查的例外情况
假如meth
可以抛出5种不同类型的未经检查的例外,
你使这个更统一,并允许调用代码只担心
关于已检查的。但是你当然可以使用未经检查的例外
这个包装也是如此。只是编译器无法执行
帮助你调用代码。