重新划分例外的好习惯吗?

时间:2014-09-03 20:39:32

标签: java exception

有时我会重新分类这样的例外:

try{
    methodA(param1);
}catch(ExceptionType1 ex){
    throw new ExceptionType2(ex);
}

当我这样做的一个例子是methodA&#ss params应该是安全的并且不会抛出异常,所以ExceptionType1实际上表示一个不同的问题(类似于ExceptionType2)。

这不会从已检查的异常重新分类到未选中。

2 个答案:

答案 0 :(得分:10)

没有错;事实上,这是一种常用的模式。

当方法契约抛出特定于域的异常时,通常会使用包含在另一个异常中的异常,但是必须处理一个特定于实现的异常,例如SQLException。

public Customer getCustomer(int id) throws CustomerDataUnavailableException {
    try {
         // access SQL database
         return customer;
     } catch ( SQLException e) {
         throw new CustomerDataUnavailableException(e);
     }
}

将客户数据存储在SQL数据库中的选择是一种实现选择,您不希望通过API泄漏(通过抛出SQLException)。

它还可以轻松更改实现,例如在移动设备上使用平面文件系统,或使用NoSql数据库 - 可以在不更改任何其他代码的情况下对方法进行更改,因为API合同是独立于实现的

最后,它使测试和模拟变得更容易 - 您不必抛出异常的异常,其中的类可能甚至无法被您的测试代码访问。

答案 1 :(得分:0)

没关系 - 根据此URL,这被定义为"链式异常"这是合法的:

http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html

以下示例显示了如何使用链式异常。

try {

} catch (IOException e) {
     throw new SampleException("Other IOException", e);
}

我会使用JAVADOC的@throws标记来记录不同类型的异常。为一种方法包含多个@throws标记是合法的;看到这个网址:

Can I use multiple @throws tags for the same exception in Javadoc?