2008-10-24 104 views
6

我有一些代碼忽略了特定的異常。忽略例外

try 
{ 
    foreach (FileInfo fi in di.GetFiles()) 
    { 
     collection.Add(fi.Name); 
    } 
    foreach (DirectoryInfo d in di.GetDirectories()) 
    { 
     populateItems(collection, d); 
    } 
} 
catch (UnauthorizedAccessException ex) 
{ 
    //ignore and move onto next directory 
} 

當然這會導致編譯時警告,因爲ex是未使用的。是否有一些標準接受noop應該用來消除此警告?

回答

12

只是把它改寫爲

catch (UnauthorizedAccessException) {} 
+0

我不知道這是允許的,漂亮的,謝謝。 – stimms 2008-10-24 04:38:38

+0

但請仍包括評論!生產代碼中只有一個完全空白的塊不應該通過代碼評審IMO。 – 2008-10-24 06:21:00

+0

>「但請仍然包含評論,,,」。不同意這一點。 「catch(SomeException){}」已經明確地說「忽略SomeException」,並且在很多情況下,額外的評論將是多餘的。 – Joe 2008-10-24 06:55:01

1

我通常做

Debug.WriteLine(ex.message) 

(這樣我可以只設置在異常斷點,如果需要的話,太)

2

戴維中號。和tvanfosson說,你想重寫它爲

catch (UnauthorizedAccessException) {} 

然而,應該問的更大的問題是爲什麼你在忽略它時捕獲異常(通常稱爲吞嚥異常)?這通常是一個壞主意,因爲它可以(並且通常)在運行時隱藏應用程序中的問題,這可能會導致非常奇怪的結果並且很難對其進行調試。

+0

至少比「catch(Exception){}」更好。 – MusiGenesis 2008-10-24 03:36:26

-1

即使我是Java開發人員(不是C#),@Scott Dorman是絕對正確的。你爲什麼「吞噬例外」?更好的是,什麼可以拋出UnauthorizedAccessException?以下是常識性的可能性:

  1. 該文件不存在
  2. 的目錄不存在
  3. 控制的當前線程不具有正確的安全權限。在* nix世界中,當前線程可能處於錯誤的組或錯誤的用戶。
  4. 磁盤崩潰
  5. 該文件的ACL設置爲只寫但未讀。同樣,對於目錄。

以上當然是一個不完整的列表。

1

假設在你的原代碼的註釋是你想要做的一個準確的描述,我覺得你想它這樣寫:

foreach (FileInfo fi in di.GetFiles()) 
{ 
    //TODO: what exceptions should be handled here? 
    collection.Add(fi.Name); 
} 

// populate collection for each directory we have authorized access to 
foreach (DirectoryInfo d in di.GetDirectories()) 
{ 
    try 
    { 
     populateItems(collection, d); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     //ignore and move onto next directory 
    } 
} 

然後你需要對TODO工作項目。

1

我同意那些認爲簡單忽略異常可能是壞主意的人。如果你不打算重新拋出它,那麼至少在某處登錄它。我寫了一些處理文件列表的小工具,我不希望單個文件出錯導致整個程序崩潰,在這種情況下,我會打印一條警告消息,以便查看哪些文件被跳過。

我個人唯一一次在沒有命名的情況下捕獲異常(如catch(xxxException)),如果我要以某種方式對它做出反應,然後重新拋出它以便我可以捕獲它一些外部常規。例如:

try 
{ 
    // do something 
    // ... 
} 
catch(UnauthorizedAccessException) 
{ 
    // react to this exception in some way 
    // ... 

    // let _someone_ know the exception happened 
    throw; 
}