重新分类异常是一种好的编程实践吗?

3
有时我会这样重新分类异常:
try{
    methodA(param1);
}catch(ExceptionType1 ex){
    throw new ExceptionType2(ex);
}

我这样做的一个例子是,当 methodA 的参数应该是安全的并且不会引发异常时,ExceptionType1 真正表明了不同的问题(类似于 ExceptionType2)。

这不是从受检异常到未经检查的重新分类。


如果有意义,那就有意义。否则就没有。 - Hot Licks
2个回答

11

没有问题;事实上,这是一个常用的模式。

当方法契约引发特定于领域的异常,但存在必须处理的特定于实现的异常时(例如 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合同与实现无关。

最后,它使测试和模拟更容易-您不必引发奇异的异常,其类可能甚至无法访问您的测试代码。


在编程时,推荐使用接口编程而不是泄露实现细节。 - jdphenix
1
你知道你可以点赞问题吗? - user2097804
1
@user2097804 尽管那是“拉票”,但你的问题很好,确实值得点赞。 - Bohemian

0

没问题 - 根据这个URL,这被定义为“链接异常”,是合法的:

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

以下示例展示了如何使用链式异常。
try {

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

我会使用@throws标签来记录JAVADOC中不同类型的异常。一个方法可以包含多个@throws标签,这是合法的;请参阅此URL:

我可以在Javadoc中为同一异常使用多个@throws标签吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接