我正在阅读J. Bloch的《Effective Java》,现在我正在阅读关于文档化未检查异常的部分。他说:
使用Javadoc @throws标签记录方法可能抛出的每个未检查异常[...]。
public interface Parameters {
//other method ommited
/**
* __DESCRIPTION_OMMITED__
*
* @throws ParameterAlreadyExistsException If a parameter with the same name already exists in this container.
*/
public <M> void put(ParameterMetaData<M> p, M value);
}
public interface ParameterMetaData<ValueType>{ }
仅仅是一个标记,用于确保编译时类型安全。ParameterAlreadyExistsException
是RuntimeException
的直接子类。
这是它的基本实现:
public final class ParametersImpl implements Parameters{
private final Map<ParameterMetaData<?>, Object> parameters;
@Override
public <M> void put(ParameterMetaData<M> p, M value){
if(value == null)
return;
if(parameters.containsKey(p))
throw new ParamAlreadyExistsException(String.format("The parameter with the name %s already exists. Value: %s", p.getClass(), parameters.get(p)));
try{
parameters.put(p, value);
} catch (Exception e){
throw new RuntimeException(String.format("Parameter insertion failed. ParameterMetaData: %s Value: %s", p.getName(), value), e);
// ^----------------Here non-documented exception is thrown.
}
}
//remainders ommited
}
由于Map#put(K, V)方法会抛出异常,而我的实现使用它并在出现问题时抛出RuntimeException
,我应该如何记录这个事实?我是否应该这样做?目前,仅凭接口文档很难说出为什么会抛出RuntimeException。
问题:我应该如何处理与实现相关的异常?我应该记录它们吗?