我正在阅读J. Bloch的有效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。
问题: 我应该如何处理特定于实现的异常?我应该记录下来吗?
答案 0 :(得分:2)
我应该如何处理特定于实现的异常?我应该记录下来吗?
你没有。就像JB Nizet在评论中指出的那样,这是一个错误,您应该测试/修复这些问题。
如果您担心要向用户显示内部错误,则可以显示一般错误,例如“发生未知错误”。在日志记录中,您可以记录实际的异常,以便用户可以向您报告错误,并且您可以看到出现了什么问题。