我的工作流套接字,流式套接字錯誤處理的WinRT
根據msdn文件建立:
處理異常
當你調用異步方法您必須編寫代碼來處理異常StreamSocket類。例外可能由參數驗證錯誤,名稱解析失敗和網絡錯誤引起。網絡錯誤(例如,連接中斷,連接故障和服務器故障)的例外可能隨時發生。這些錯誤會導致異常被拋出。如果未由您的應用程序處理,則異常會導致您的整個應用程序被運行時終止。
Windows.Networking.Sockets命名空間具有可簡化使用套接字時的處理錯誤的功能。 SocketError類的GetStatus方法可將HRESULT從異常轉換爲SocketErrorStatus枚舉值。這對於在應用程序中處理特定的網絡異常有所幫助。應用程序還可以使用參數驗證錯誤異常中的HRESULT來了解有關導致異常的錯誤的更多詳細信息。
所以我用下面的代碼來處理套接字連接錯誤狀態。
try
{
var socket = new StreamSocket();
HostName host = new HostName("www.google.com");
// connection is executed synchronously
socket.ConnectAsync(host, "2000", SocketProtectionLevel.PlainSocket).AsTask().Wait();
Debug.WriteLine("Success");
}
catch (Exception ex)
{
SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.HResult);
switch(socketErrorStatus)
{
case SocketErrorStatus.ConnectionTimedOut:
//do something
break;
case SocketErrorStatus.HostNotFound:
//do something
break;
default:
break;
}
}
但是,socket錯誤返回的異常對象不包含有效的HResult。
以下爲得到的異常對象:
計數 =名稱「InnerExceptionCount」在當前上下文中 [System.AggregateException]不存在:計數=名稱「InnerExceptionCount」在當前不存在上下文
數據:{System.Collections.ListDictionaryInternal}
HELPLINK:空
的HResult: -2146233088
InnerException: {System.Exception:連接嘗試失敗,因爲連接方在一段時間後沒有正確響應,或者由於連接的主機未能響應而建立連接失敗。 (來自HRESULT的異常:0x8007274C)}
消息:「發生了一個或多個錯誤。」
源: 「mscorlib程序」
堆棧跟蹤:「在System.Threading.Tasks.Task.ThrowIfExceptional(布爾includeTaskCanceledExceptions個)\ r \ n在System.Threading.Tasks.Task.Wait(的Int32 millisecondsTimeout,的CancellationToken的CancellationToken )\ r \ n在System.Threading.Tasks.Task.Wait(個)\ r \ n在StreamSokcetSample.MainPage.Button_Tapped(對象發件人,TappedRoutedEventArgs五)」
在這種情況下,我總是得到SocketErrorStatus.Unknown(默認值)作爲結果,而當我通過int值HRESULT:0x8007274C到GetStatus,它會導致正確的輸出(ConnectionTimedOut = 3)。
的InnerException: {System.Exception的:A連接嘗試失敗,因爲連接的方沒有正確一段時間後響應或已建立的連接失敗,因爲連接的主機沒有反應。 (例外從HRESULT:0x8007274C)}
我可以依靠內部異常消息並從那裏取回HRESULT?
有沒有其他的方法來獲得想要的結果?