2017-10-10 80 views
4

假設下面的代碼片段:何時應該記錄異常?

public function foo() 
{ 
    return $this->dependency->bar(); 
} 

如果dependency::bar()被稱爲拋出異常,但預計不會foo()來處理它。 foo()在其文檔塊中是否有@throws條目?或者這應該是隱含的? phpdoc文檔對此有點模糊。

假設dependency是基於接口注入的;如果接口文件的方法可以在處拋出指定的異常。

這個異常應該由調用代碼處理還是與情況無關?

語義您已經創建公共職能(每個人都可以使用它),在某些情況下,可以拋出異常一路:)

+1

其他語言(java)必須顯式定義在函數體中引發(而不是處理)哪些異常。如果處理調用堆棧中的異常,看起來有點痛苦,但添加信息不會造成傷害。 (在這個具體的例子中,正如你所說的,foo沒有處理異常,foo不知道調用者是否會處理它,所以根據foo,應該注意) – Gerard

+1

由於'$ this-> dependency - > bar()'是調用者和/或文檔的用戶不能/不應該知道的內部實現細節,記錄異常是使其可捕獲的唯一方法。 – deceze

+0

btw如果您使用PhpStorm - IDE會鼓勵您在@throws項中出現此類異常。 –

回答

2

- 因此你一定要在你的docblock @throws條目。
如果異常從您的依賴項中拋出 - 這是您的內部實現並且被封裝 - 因此,使用您的函數的人將不知道您的函數期望什麼。

在接口注入的情況下 - 接口必須描述所有異常,因爲異常是類和接口行爲的一部分,必須描述所有可能的行爲。

如果您有try-catch阻止並處理所有來自依賴關係的異常 - 您必須在您的docblock中的@throws條目中只有自己的例外。

+0

爲了澄清,你會捕捉並重新拋出錯誤嗎? – Timo

+0

@Timo是的,你可以這樣做,你必須在'@ throws'塊中描述你的異常。 –