2012-07-24 40 views
0

我有通過外部Web服務檢索到的記錄列表。一些數據是垃圾,並希望通過拋出新的異常來記錄失敗的記錄。c#在循環OK中拋出新的異常?

想知道這是否是最好的處理方式,因爲我讀取異常會影響性能?

Pseudo code e.g. 

try 
Loop through listOfRecords 
    perform logic. 
catch 
    throw new exception (record details) 

回答

0

這不是最好的方法,因爲你只需要日誌寫入功能。只需寫入日誌和continue循環。

1

這取決於您在遇到異常時如何處理剩餘的記錄。你當前的實現會在第一個錯誤中終止循環。

但是,如果你只是想紀念唱片以某種方式爲「未處理」或「出錯」,並繼續執行剩餘的記錄,你要處理整個循環中的錯誤:

foreach (var record in records) 
{ 
    try 
    { 
     Process(record); 
    } 
    catch (TypedException ex) 
    { 
     LogError(ex); 
     MarkAsUnprocessed(record, ex); 
     // respond in some other way as well? 
    } 
} 

最終,異常處理邏輯屬於邏輯上合理處理異常的地方。 捕捉例外是簡單的部分,這是一個簡單的使用語言的結構。有意義的處理異常是完全的另一個故事,是一個獨立於所用語言的邏輯結構。

編輯:這也是非常值得指出的是,你的僞代碼意味着異常處理的是這樣的:

try 
{ 
    // something 
} 
catch 
{ 
    throw new Exception("something"); 
} 

這是非常不好的做法。拋出一個全新的異常基本上拋出了被捕獲的異常,從而擺脫了一些非常有用的調試信息(其中最重要的是堆棧跟蹤)。如果你想立即記錄異常,然後讓它繼續往上堆,僅僅通過自身使用關鍵字throw

try 
{ 
    // something 
} 
catch (Exception ex) 
{ 
    // log the exception 
    throw; 
} 

如果你想上下文到異常,你可以把它扔之前修改其屬性再次。或者甚至更好,拋出定製異常(不Exception),而將現有的InnerException屬性:

try 
{ 
    // something 
} 
catch (Exception ex) 
{ 
    throw new RecordProcessingException("some additional context", ex); 
} 

如果,另一方面,沒有什麼意義與在異常完成目前的情況下,甚至根本沒有抓住它。讓它向上冒泡,直到遇到可以有效處理它的代碼。