2009-08-05 52 views
3

是否有任何關於在大型軟件中每個源代碼行有多少catch語句的規則?例如,在用C#編寫的軟件中,Visual Studio顯示了大約350行包含單詞「catch」的行,並且cloc報告說我們有大約160k SLOC,30k註釋行和15k空白行。每個捕獲語句160k/350大約是467行代碼。良好的捕獲語句與代碼行之間的比率

但是,由於我們使用標準的C#格式化,並在它們自己的行上使用了大括號,所以誰知道160k中有多少行只是單個括號,而160k正在計算一些文件樹不再編譯到應用程序等等。我可能猜測「有用」比率接近每400 LOC的1個捕獲量。

至少不出乎意料,我們錯過了一個半關鍵的異常,它被捕獲到一個空的catch塊中,所以現在我正在通過代碼庫並至少打印出調試控制檯的異常作爲一種臨時措施,或者在抓到的例外方面變得更具體。這當然會增加我們在整個應用程序中的捕獲次數,但是它會使我們更接近「可接受」區域嗎?我不知道每467 LOC的1次捕獲是好還是好,甚至是可怕的。


我很瞭解 爲什麼不使用空的catch塊。其他/以前的維護者一直很懶。而且由於這個產品的下一個版本對時間要求很高,所以我現在沒有時間進入並正確地修復所有300(?)糟糕的捕獲聲明並驗證軟件的正確運行(當然,我們幾乎沒有自動化測試使這更容易:/)。

我只是在尋找是否有任何一種「直覺」,以至於應該多頻繁地看一次try-catches。有幾個答案說這是上下文敏感的,這是我所懷疑的,但不確定的。

回答

10

很難給出一個通用數字 - 它將取決於應用程序的意圖是什麼以及是否需要執行可能以可恢復方式失敗的操作。

重要的一點是,空的catch塊是一個非常糟糕的主意。這比每個catch塊的代碼行更重要。

+0

空試塊本身並不是一個壞主意(即它們可以正確使用)。只有主程序員濫用它們,他們應該真正記錄錯誤並提供用戶反饋。 – Noldorin 2009-08-05 16:53:15

+0

查看基於此的另一個問題,處理空try-catch塊:[爲什麼空catch塊是個壞主意?](http://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks- A-壞主意)。 – Lode 2011-08-10 09:32:52

+4

不贊同Noldorin,並會建議空的catch塊總是錯的。如果您確實想要完全忽略某種類型的問題,請以某種方式限定捕獲量,以便僅忽略您期望的錯誤類型。方法:catch(VerySpecificExceptionType ex){} >>或<< catch(Exception ex){if(ex.Message!=「我期望的東西」)throw; } >> 我打開反例,空的catch塊可能沒問題,但我很懷疑:) – pettys 2011-09-16 16:37:19

13

你不應該捕捉異常,除非你真的要處理他們。除非處理程序可以「撤消」例外情況,或者以其他方式增加價值,否則應該允許例外情況冒泡給可以處理它的人。

+2

謝謝!很多人只是在沒有做任何事情的情況下捕捉異常。如果您不打算處理異常,只需在應用的頂部放置一個捕獲記錄異常並向用戶發送消息。我討厭通過代碼在幾百個地方發現異常但從未處理過的代碼。 – 2009-09-01 23:48:29

6

我會完全忽略這樣的指標。計算代碼行不一定是有用的指標 - 特別是在查找比率時。

這裏真正的答案完全取決於上下文。 catch語句的「正確」數量是處理可能發生的異常所需的try/catch塊的數量,您將正確處理這些異常。你應該圍繞任何可能發生的異常處理try/catch塊。如果你無法正確處理它(或不想處理它),讓它向上傳播 - 不要抓住它。

catch塊的數量完全取決於你寫的代碼的類型。例如,如果您正在編寫網絡代碼,那麼您將更有可能進行更多的異常處理(因爲網絡本質上更可能存在需要處理的問題)。

2

作爲一個非常粗略的指標,我的經驗法則是每個事件處理程序中至少有一個會記錄異常。

關於其他方法,我更喜歡讓它們免試試;據說,有很多次我添加了catch塊來爲麻煩的錯誤報告添加狀態(「parameter = value」),然後只是「拋出」到主處理程序。如果你擅長修正錯誤,這種方法會導致很多死代碼。