2010-07-15 92 views
1

使用try-catch塊時,將catch塊留空是否總是一種糟糕的編程技巧?捕捉異常,是否和不要

在我預計會發生異常的情況下,例如,我正在從文件讀取10個值並將每個值轉換爲字符串。有可能這10個值中的一個可能爲空,但我不想在這一點停止執行,而是繼續(明顯使用try catch)

我的一個蹩腳的例子嘗試:

String _text = textReader.ReadLine(); //Assuming this RETURNS a NULL value 
try { 
     String _check = _text.ToString(); 
     //Do something with _check, but it should not be NULL 
    } 
catch (Exception) 
    { //Do Nothing } 

在這一點上,當我抓到一個例外:
1.我不想記錄此。因爲我期待一個錯誤的價值。
2.我不想重新向調用堆棧拋出異常。
3.我想繼續執行我的執行
在這些情況下,是否可以接受爲空?或者這是一個完整的NO-NO,有更好的方法來處理這個問題嗎?

我認爲這可以是一個社區維基,因爲它也處理編程技術。
- 伊瓦爾

+0

可能重複:http://stackoverflow.com/questions/2737328/why-should-i-not-wrap-every-block-in-try-catch – Konrad 2010-07-15 18:55:20

+0

@Konrad:我不認爲所以。你列出的可能重複是關於try/catch塊是否應該正常使用;這是一個空的catch塊在某種情況下是否有意義。 – 2010-07-15 19:13:30

回答

4

我假設你的意思是

_text.ToString() 

和你擔心的情況下_text可能

我不喜歡你在這種情況下使用異常。讓自己置身於需要維護此代碼的人的頭腦中。他們看到:

catch (Exception) { } 

他們真的可以推斷出所有這一切正在捕獲空情況嗎?他們必須考慮可能拋出的其他異常。這至少會引起維護者頭腦中的不確定性。

爲什麼你能不能代碼:

if (_text != null) { 
     String _check = _nullValue.ToString(); 
} 

這究竟說你是什麼意思。

但是,進一步說,獲取NULL的值是什麼意思?您正在讀取一個可能包含10個值的文件。我猜測可能是空白行給你一個null?

如果你有什麼打算:

1 
2 
<blank line> 
4 
... 
10 

所以這是9個良好的價值觀和一個空行。如果你得到10個好的價值觀和一條空白的線,你會做什麼? 11個好價值? 11個很好的值和一個空行?

我的觀點是,默默地忽略用戶輸入中的怪異往往是一個壞主意。上面的一些情況實際上很可能是拼寫錯誤。在某些情況下,警告您可能對用戶非常有幫助。這意味着,如果不是實際的即時錯誤日誌,那麼輸入中的大多數情況可能至少需要某種類型的計數。

你可能,例如,在年底

Your file contained 13 lines, two lines were blank. We processed 10 valid values and ignored one. 

在調試的目的,你可能有錯誤的路徑跟蹤語句非常leasyt發出的消息。

摘要:完全忽略異常很少是正確的做法。

+0

+1:正如他所說。我還會補充一句:如果你絕對肯定地想要吞下一個異常,至少應該提供一種可選的方式來記錄它。這樣,如果代碼行爲異常,您有機會在運行時驗證您確實在吞嚥您期望得到的異常,而不是其他東西。 – Lars 2010-07-15 19:27:51

0

如果預計它不是特例。這是否很好地利用了異常?在嘗試做某事之前測試一個空值可能更合適。

if(_text != null) 
    // do something 
0

我喜歡的最佳論據是代碼將變得高度不可維護。我的目標是讓我的代碼儘可能容易理解。 有了上面的建議,我有一個三元運營商的軍隊(我個人最喜歡的大if-else塊)。
而代碼絕對看起來更好!而且我認爲除非嘗試抓住有充分的文件記錄,否則我自己並不認爲有空的抓住言論的好理由。

謝謝你們!
-Ivar