2015-12-16 31 views
0

我正在閱讀Robert C. Martin的「Clean Code」一書,他強烈建議「將try和catch塊的主體抽出到自己的函數中「提取Try/Catch塊 - 微軟公約/標準

下面是書中例子,要清楚:

public void delete(Page page) 
{ 
    try 
    { 
     deletePageAndAllReferences(page); 
    } 
    catch (Exception e) 
    { 
     logError(e); 
    } 
} 

private void deletePageAndAllReferences(Page page) throws Exception { 
    deletePage(page);  
    registry.deleteReference(page.name);   
    configKeys.deleteKey(page.name.makeKey()); 
} 

private void logError(Exception e) {  
    logger.log(e.getMessage()); 
} 

的理由這樣做是:

  • try/catch塊混淆structu重新編碼和混合錯誤處理與正常處理
  • 很好的分離,使代碼更容易理解和修改。

的事情是,我已經工作了幾年在幾個項目,這絕不是一個規則,我沒有發現誰遵循這甚至在他們最關心乾淨的代碼的環境中的人。

所以我想知道: 這本書的例子是基於Java的,我正在使用C#/ .NET,.NET的社區有什麼標準或慣例來自.NET社區?

+0

歡迎來到現實世界;有多少人甚至可以完成「代碼完成」中強調的基本內容?我記得一個剛剛上大學的編碼員到達一個項目並且幾乎尖叫,「規格!規格!功能規格在哪裏!」當滾石樂隊演唱並演奏時,你總是無法得到你想要的東西。 –

+1

有一天,有人可能會遇到'deletePageAndAllReferences()',並說 - 「誰在這裏沒有放任何try-catch的愚蠢的nincompoop?讓我添加一個」_「。然後,你最終嘗試趕上嘗試捕捉奇蹟的表現 – MickyD

+0

這是Java或C#('拋出異常{')? – Rob

回答

2

我能想到的一個原因是如果catch塊有多於一行的話。例如,如果您記錄錯誤,發送通知電子郵件以及回滾數據庫事務等。如果你開始向catch塊添加其他東西,你會發現自己不得不重複代碼。

+0

即使只有一行,也值得提取。如果稍後您決定將日誌記錄從'logger.log(stuff)'更改爲'someOtherLogger.log(stuff)',那麼您不想在十幾個不同的地方替換它。 –

+0

優秀點 –

+0

@DavidGreilach好榜樣大衛。我同意Pierre-Luc Pineault,即使它只有一行,我們也應該提取它。你認爲在這個嘗試中值得這麼做嗎?我認爲Micky有一個很好的觀點,他說,如果這不是整個項目中的慣例,那麼有人可以看到提取的函數並放置try-catch塊,最後可以嘗試一個try-catch -抓住 –