我從來沒有完全滿意異常處理的工作方式,有很多異常和try/catch帶來的表(堆棧展開等),但它似乎打破了很多OO模型的過程。在C#中減少重複的錯誤處理代碼?
不管怎麼說,這就是問題所在:
假設你有一些類包裝或包括網絡文件IO操作(例如閱讀和寫作的地方在某些特定的UNC路徑某些文件)。出於各種原因,您不希望這些IO操作失敗,因此如果檢測到它們失敗,請重試它們,並且不斷重試它們,直到它們成功或達到超時。我已經有一個方便的RetryTimer類,我可以實例化並用它在重試之間休眠當前線程,並確定何時超時時間已過,等等。
問題是,您有一堆IO操作這個類,你需要在try-catch/retry邏輯中包裝它們。
下面是一個示例代碼片段:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
那麼,你如何避免整個類最複製該代碼的每個文件IO操作?我的解決方案是在執行傳遞給它的委託塊的類中使用匿名委託塊和單個方法。這讓我做這樣的事情在其他的方法:
this.RetryFileIO(delegate()
{
// some code block
});
我喜歡這個有點,但它留下來了很多有待改進。我想聽聽其他人會如何解決這類問題。
只是一個通用的供參考:它是[幾乎*總是*更好](http://philosopherdeveloper.wordpress.com/2010/05/05/re-throwing-caught-exceptions/)只是`拋出;而是`throw e;` – 2010-09-13 03:34:47