2017-07-26 60 views
0

如果你有一個接口,並且你不知道它的方法將如何實現(即它是一個其他用戶將會擴展的庫),你怎麼知道該方法的實現是否會出現異常?你應該在每個接口方法上聲明「throws Exception」,因爲你不知道實現嗎?總是在接口方法中聲明「拋出異常」?

例如,我正在創建一個http客戶端。該庫具有Request接口,它表示一個http請求字符串:

public interface Request 
{ 
    String asString(); // no "throws" here 
} 

public final class AssembledRequest implements Request 
{ 
    // ... 
    public AssembledRequest(Method method, Url url, Headers headers, Body body) { 
     // ... 
    } 
    public String asString() { 
     // ... 
    } 
} 

它也有一個Response類,它使用此Request接口。 我自己的實現(AssembledRequest)不會拋出異常,它只是組裝一堆字符串,可能大多數實現不會拋出任何東西。

但是如果用戶想要以asString從文件讀取的方式實現Request會怎麼樣?然後我們正在處理IOExcepton,用戶很難處理這種例外情況。沒有throws...聲明,所以你必須在方法內部處理它,這是一個不錯的方法,因爲你想抓住它並重新拋出,所以它會冒泡到你的應用程序的頂部,然後被處理。

如果Request接口在asString上聲明瞭throws Exception,它會容易得多。這使我得出結論,對於庫,所有接口的方法應該有throws Exception。我對嗎?

+0

您應該知道這些方法是否有可能拋出異常。如果你不想拋出異常,那麼如果它們容易出現異常,你將不得不在實現它的方法中嘗試catch。 –

+0

向接口方法中添加'throws Exception',因爲有一天,也許,也許,也許,有人可能需要它是最糟糕的一種YAGNI(你不會需要它)。你讓所有後代永遠支付。不是一個好計劃。 –

+0

@BobDalgleish當'asString'從文件讀取時,你會如何解決我的問題? –

回答

-1

該接口是實現和規範之間的API。如果你正在編寫API,那麼你會知道你的API是否會允許拋出一些東西。

這就是說,我會採取這兩個動作之一:

  • 這裏拋出異常的這些類型實現一個單獨接口是可以接受的,或
  • 裹在一些一RuntimeException的檢查異常無論如何,讓它起泡。

例外是例外的原因。除非你的代碼明確地期望它,否則不要明確地允許它。

相關問題