有时我会重新分类这样的例外:
try{
methodA(param1);
}catch(ExceptionType1 ex){
throw new ExceptionType2(ex);
}
当我这样做的一个例子是methodA&#ss params应该是安全的并且不会抛出异常,所以ExceptionType1实际上表示一个不同的问题(类似于ExceptionType2)。
这不会从已检查的异常重新分类到未选中。
答案 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?