2015-11-06 79 views
2

我正在閱讀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>{ }只是一個標記,以保證編譯時類型安全。 ParameterAlreadyExistsExceptionRuntimeException的直接子類。

這裏是它的一個基地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。

問題:我應該如何處理執行特定的異常?我應該記錄它們嗎?

+1

Map.put()不會拋出任何檢查的異常。它引發的所有運行時異常都是代碼中的錯誤信號。你沒有發現任何一個。 –

+0

相關:http://stackoverflow.com/questions/824217/should-methods-that-throw-runtimeexception-indicate-it-in-method-signature?rq=1 – 2015-11-06 06:44:33

+0

@JBNizet其實它沒有。但是如果我沒有捕獲它,它會傳播,接口的客戶端會看到一些關於放入內部HashMap的混淆信息。也許它會很好地抓住它並轉化爲更合適的例外? –

回答

2

我應該如何處理特定於實現的異常?我應該記錄它們嗎?

你不知道。像JB Nizet在評論中指出的那樣,這是一個錯誤,您應該測試/修復這些類型的問題。

如果您擔心要向用戶顯示內部錯誤,則可以顯示一般錯誤,如'發生未知錯誤'。在您的日誌記錄中,您可以記錄實際異常,以便用戶可以向您報告錯誤,並且您可以查看錯誤。