2011-05-25 103 views
6

我正在使用一些代碼異步使用HttpWebRequest。如果你以前曾經這樣做過,那麼你知道錯誤處理可能有點痛苦,因爲如果在其中一個回調方法中拋出異常,它就不能通過嘗試傳遞迴調用代碼/ catch塊。在C#中處理異步HttpWebRequest異常的最佳方式是什麼?

我想要做的是通過保存傳遞給每個回調方法的狀態對象中的異常來處理錯誤。如果發現異常,狀態對象將被更新,然後http呼叫將被中止。我遇到的問題是,在我的狀態對象中,我必須使用Exception屬性,以便可以存儲任何類型的異常。當調用代碼檢查狀態對象並「看到」一個異常時,它不知道它是什麼類型的異常。

有沒有辦法讓我的狀態對象來保存任何類型的異常,但仍然保持異常強類型?

狀態對象

public class HttpPostClientAsyncModel 
    { 
     public HttpResponseSnapshot Response { get; set; } 
     public HttpPostClientAsyncStatus Status { get; set; } 
     public Exception Exception { get; set; } 
     public WebRequest Request { get; set; } 
    } 
+0

調用代碼可能只是扔model.Exception try塊內,然後設置爲捕獲調用者可以適當處理的特定的Exception子類型。或者可能不是...... :) – dlev 2011-05-25 23:44:06

+0

這僅僅是爲了學習體驗嗎? HttpWebRequest.BeginGetResponse有什麼問題? – 2011-05-25 23:59:45

回答

1

異常對象仍然是強類型並保留其原有的字段值。所有你需要的是檢查它像這樣:

if (asyncModel.Exception is ArgumentException) 
{ 
    // Handle argument exception here 
    string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName; 
} 
else if (...) 
{ 
} 

你通常會做與try/catch塊一個非常類似的檢查反正所以這不應該是不方便。如果你真的擔心這個,只要創建與同步方法一個新的線程,並延續選項處理異常:

Task.Factory.StartNew(() => { DoWork(); }) 
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception), 
TaskContinuationOptions.OnlyOnFaulted); 
相關問題