我有通過外部Web服務檢索到的記錄列表。一些數據是垃圾,並希望通過拋出新的異常來記錄失敗的記錄。c#在循環OK中拋出新的異常?
想知道這是否是最好的處理方式,因爲我讀取異常會影響性能?
Pseudo code e.g.
try
Loop through listOfRecords
perform logic.
catch
throw new exception (record details)
我有通過外部Web服務檢索到的記錄列表。一些數據是垃圾,並希望通過拋出新的異常來記錄失敗的記錄。c#在循環OK中拋出新的異常?
想知道這是否是最好的處理方式,因爲我讀取異常會影響性能?
Pseudo code e.g.
try
Loop through listOfRecords
perform logic.
catch
throw new exception (record details)
這不是最好的方法,因爲你只需要日誌寫入功能。只需寫入日誌和continue
循環。
這取決於您在遇到異常時如何處理剩餘的記錄。你當前的實現會在第一個錯誤中終止循環。
但是,如果你只是想紀念唱片以某種方式爲「未處理」或「出錯」,並繼續執行剩餘的記錄,你要處理整個循環中的錯誤:
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);
}
如果,另一方面,沒有什麼意義與在異常完成目前的情況下,甚至根本沒有抓住它。讓它向上冒泡,直到遇到可以有效處理它的代碼。