我正在閱讀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
的直接子類。
這裏是它的一個基地implemetation:
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)方法拋出我的implementaiton使用它,並拋出RuntimeException
如果服用點出了問題,我應該如何對此進行記錄?我應該這樣做嗎?目前很難說接口文檔爲什麼會引發RuntimeException。
問題:我應該如何處理執行特定的異常?我應該記錄它們嗎?
Map.put()不會拋出任何檢查的異常。它引發的所有運行時異常都是代碼中的錯誤信號。你沒有發現任何一個。 –
相關:http://stackoverflow.com/questions/824217/should-methods-that-throw-runtimeexception-indicate-it-in-method-signature?rq=1 – 2015-11-06 06:44:33
@JBNizet其實它沒有。但是如果我沒有捕獲它,它會傳播,接口的客戶端會看到一些關於放入內部HashMap的混淆信息。也許它會很好地抓住它並轉化爲更合適的例外? –