2011-03-16 58 views
1

我有下面的代碼拋出捕食異常

try 
{ 
    fileInfo.CopyTo(destination, true); 
} 
catch (IOException ioex) 
{ 

} 

log4net的日誌:

35552|384|1|ERROR| at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 

我需要吃這種例外和記錄它。我需要抑制這個錯誤信息。

如何做到這一點?

+3

不要在你的catch中調用log.Error? – BlackICE 2011-03-16 17:30:35

+1

@David:我的猜測是他正在編寫一個記錄未處理異常的代碼庫,並且他無法控制未處理的異常處理程序。 – 2011-03-16 17:32:43

+0

@Harpo可以大大降低發生異常的可能性,但對於IO內容,您仍然需要恰當地捕獲並處理異常,因爲不能保證在檢查時間和執行IO操作的時間之間有一些外部程序沒有修改該磁盤,使該操作不再有效。 (並且...它看起來像我回復的評論已被刪除...) – Davy8 2011-03-16 17:35:42

回答

1

我懷疑你需要看看Log4net,看看是否有辦法只記錄未處理的異常(如果這是你想要的)或者告訴它忽略特定位置的異常。

爲什麼你想隱藏這個呢?如果這是因爲發生了很多事情,並用無用的信息填滿日誌,那麼在調用CopyTo以確保它有成功的合理機會(即路徑有效,文件存在等)之前,您可能需要進行一些驗證。這也將減少排在第一位的例外數量。例外情況在性能方面有點昂貴,所以如果可以的話,你需要防止它們發生。

正如我在這個問題的評論中提到的那樣,你不能完全刪除異常處理,因爲在檢查它存在和實際調用CopyTo之間始終有另一個程序刪除該文件的機會,但它應該是非常罕見的發生。

如果這種情況沒有經常發生和/或您已經在進行檢查,那麼偶爾會發生什麼危害?

0

把函數調用中一個try/catch,抓問題的異常,並提供一個空塊:

try 
{ 
    fileInfo.CopyTo(destination, true); 
} 
catch (Exception) 
{ 
    // do nothing 
} 

注意捕捉異常(而不是正確的子類)是可怕的做法。

好的,這個問題是我寫的這個悄悄編輯的。我不知道log4net會記錄所有通過CLR的異常。我很快就會刪除它,但現在我會留下來以備進一步評論。

+0

這是一個比OP最初發布的代碼更好的解決方案嗎?他應該堅持吞嚥一個特定的例外,只要確保它是正確的(並且在所有情況下它都是可以忽略的,這是很難證明的)。 Log4net可能有一些特定的內容記錄了所有拋出的異常,在這種情況下,他應該查閱文檔或等待熟悉Log4net的回答者。 – 2011-03-16 17:44:40

+0

@ P.Brian.Mackey:哦,不公平。他編輯了這個問題!在那種情況下,我顯然對log4net不夠熟悉。我不知道你可以攔截異常捕獲。這讓我覺得這是一種可怕的做法 - 如果一些設計不佳的圖書館使用例外來表示失敗情況,那該怎麼辦?日誌會被完全污染,可能會被吃掉的異常! – 2011-03-16 17:50:28

+0

我的想法是,因爲這不是一個例外,而是一個錯誤。正如它所說。是否有可能吃錯誤? – DarthVader 2011-03-16 17:52:16