ExpectedExceptions 範例示範如何在使用具類型的用戶端時攔截預期的例外狀況。 這個範例是以實作計算機服務的使用者入門範例為基礎。 在此範例中,用戶端是控制台應用程式(.exe),而服務是由 Internet Information Services (IIS) 所裝載。
備註
此範例的安裝程式和建置指示位於本主題結尾。
此範例示範擷取和處理更正程式必須處理的兩個預期例外狀況類型: TimeoutException 和 CommunicationException。
Windows Communication Foundation(WCF)用戶端的通訊方法拋出的例外狀況可能是預期的,也可能是非預期的。 非預期的例外狀況包括災難性失敗,例如 OutOfMemoryException 和程式設計錯誤,例如 ArgumentNullException 或 InvalidOperationException。 通常沒有有用的方法來處理非預期的錯誤,因此通常您不應該在呼叫 WCF 用戶端通訊方法時攔截它們。
WCF 用戶端上的通訊方法預期會引發的例外狀況包括 TimeoutException、CommunicationException 以及 CommunicationException 的任何衍生類別。 這些表示在通訊期間發生問題,可藉由中止 WCF 用戶端並報告通訊失敗來安全地處理。 由於外部因素可能會在任何應用程式中造成這些錯誤,因此正確的應用程式必須攔截這些例外狀況,並在發生時復原。
可以由用戶端拋出的 CommunicationException 衍生類別有數個。 在某些情況下,應用程式也會攔截其中一些來執行特殊處理,但讓其他的則交由 CommunicationException 來處理。 您可以首先擷取更特定的例外狀況類型,然後在稍後的 catch 子句中攔截 CommunicationException,以達成此目的。
呼叫客戶端通信方法的程式碼必須攔截 TimeoutException 和 CommunicationException。 處理這類錯誤的其中一種方法是中止客戶端並報告通訊失敗。
try
{
...
double result = client.Add(value1, value2);
...
client.Close();
}
catch (TimeoutException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
catch (CommunicationException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
如果發生預期的例外狀況,客戶端之後可能或可能無法使用。 若要判斷用戶端是否仍然可用,請檢查 State 屬性是否為 CommunicationState。打開。 如果它仍然開啟,它仍然可用。 否則,您應該中止客戶端,並釋放所有指向它的參考。
謹慎
您可能會注意到,具有會話的用戶端在發生例外狀況後通常便無法再使用,而沒有會話的用戶端在發生例外狀況後仍然常常可以使用。 不過,這兩者都無法保證,因此如果您想要嘗試在例外狀況之後繼續使用用戶端,應用程式應該檢查 State 屬性以確認用戶端仍已開啟。
當您執行範例時,作業回應和例外狀況會顯示在用戶端主控台視窗中。
用戶端進程會執行兩個情境,每個情境都會嘗試呼叫 Add ,後面接著 Divide。 第一個場景模擬網路問題,會先終止客戶端,再呼叫Divide。 第二個情境會將逾時設定得過短,導致該方法無法完成,從而出現逾時情況。 從用戶端處理序產生的預期輸出如下:
Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException