2015-07-02 160 views
1

說我有一個存在於庫/框架中的方法,我想知道這些方法是否應該拋出異常或默默失敗;例如:框架代碼:靜默失敗或拋出異常

void PerformAction(Item item) 
{ 
    // throws NullReferenceException if item is null 
    item.DoThis(); 
} 

void PerformAction(Item item) 
{ 
    //fails silently 
    if(item != null) 
    { 
     item.DoThis(); 
    } 
} 

哪種解決方案更好 - 或者這是一個主觀問題?

+3

這將是非常主觀的,但我相信大多數的聲音會說你應該大多是'扔'。至少用於調試目的。如果框架有一個日誌記錄機制,如果你不願意拋出,你應該記錄失敗的任務。 –

回答

1

如其他人所述,這可能是主觀的,也可能取決於上下文和情況。儘管如此,我認爲投擲是迄今爲止最好的選擇。


我喜歡這個簡單的比喻;天真,因爲它可能是,它使一個明確而正確的觀點:

老闆:嘿喬,你能不能幫我一個忙,跑下來會計,有提供這些重要的文件給我嗎?
Joe:好的,沒問題。

喬下降到會計,但發現大門緊鎖,所有人都出去吃午飯

可能的後續#1:

喬回到他的老闆:對不起,辦公室關閉了。如果您想要我,我可以稍後再試,或者您可以選擇其他方式來獲取文檔?

可能採取的後續#2:

喬意識到他不能完成任務,所以他只是滴在一個垃圾文件收集..嗯..垃圾容器,並調用它天。

如果您是老闆,您更喜歡哪種選擇?

3

這實際上是一個主觀問題,取決於案例。

例如,如果這個api提供了對數據庫的一些操作,並且每當api用戶想要創建一條記錄時,默默地忽略就會讓人頭疼。

另一方面,如果這個操作只是可選的,忽略不會造成傷害。例如,api開發人員可能希望通過使用Web服務來保存使用此api執行的操作次數。在這種情況下,如果服務不可用,你可能會失敗,因爲這不是api的目的。

此外,還有另一種選擇;您可以簡單地提供不同類型的異常來提供有關可選異常的數據。您可以允許用戶通過配置啓用或禁用此選項。

1

我想你應該拋出異常。 如果您按照Principle of Least Astonishment(POLA),PerformAction應該採取措施。因此,如果該項目是null,則無法執行該操作,因此您會期望得到反饋。

但是如上所述,這是非常主觀的。

相關問題