2011-09-15 28 views
2

我總是似乎來到了一個十字路口,在那裏我不完全知道如何處理異常,而不會重新投向調用者。如何處理本地異常?

有沒有更好的方法來處理下面的情況?

private DataHandler retrieveFromGridFS(ObjectId id) throws IOException 
{ 
    GridFS gridFS = new GridFS(getDBReference());   
    GridFSDBFile out = gridFS.find(id); 

    File temp = File.createTempFile(
      (String)out.getMetaData().get("productName"), 
      (String)out.getMetaData().get("productType")); 

    out.writeTo(temp); 

    return new DataHandler(new FileDataSource(temp));   
} 

上面private方法可以拋出IOException

利用這種方法,像這樣:

public DataHandler retrieveProduct(String productId) throws IOException 
{ 
    ObjectId id = new ObjectId(productId); 
    DataHandler handler = null; 

    try 
    { 
     handler = retrieveFromGridFS(id); 
    } 
    catch(IOException ex) 
    { 
     logger.error(ex); 
     throw new IOException("A problem occurred retrieving product."); 
    } 

    return handler; 
} 

我被迫重新拋出這樣我就不會冒險返回null。

+2

不要扔掉原來的異常tho,從日誌文件中進行調試要困難得多使用'throw new IOException(「檢索產品時出現問題」,前);' – MeBigFatGuy

+0

+1;絕對 - 刪除潛在的原因是調試的麻煩。 –

回答

2

這完全取決於。

首先,您是否真的想將IOException滲透到上層,或者是否希望封裝可能發生在特定於應用程序的異常中較低層的各種異常?

您是否需要從此異常中恢復?如果沒有,是更合適的RuntimeException? (即使你需要的例外是可以恢復的,你在處於較高水平提供了聲明式異常處理的環境中運行?)

會更有意義使用NullObject模式,以避免返回空值?

(等等:)

+0

+1參考'NullObject'模式 – wulfgarpro

0

一般來說,捕獲異常,如果你能發生響應該事件。例如,假設您有代碼在失敗時重試連接。然後,您可能會有一個捕獲IOException並重試x次的循環。上面的調用者不關心潛在的故障。

當發生無法處理的異常時,您不會這樣做。基本上你是在推卸責任。

最近我一直傾向於避免重新拋出異常,因爲在大多數情況下,其他人會刪除對象。我通過經驗發現,它大部分時間並沒有增加價值。

0

什麼?在我看來,像retrieveProduct只是一個方便的功能,可以執行retrieveFromGridFS所做的任何操作,但是使用String作爲標識符而不是ObjectId。那麼它可以引發的一系列例外情況是否與retrieveFromGridFS相同呢?

+0

這就是我在我的例子中顯示 - 我不知道你想說什麼? – wulfgarpro

+0

哦,我明白了,我沒有意識到'retrieveProduct'是私人的。 –

+0

不是,'retrieveFromGridFS'是。 – wulfgarpro