2015-07-20 32 views
3

我的工作流套接字,流式套接字錯誤處理的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:0x8007274CGetStatus,它會導致正確的輸出(ConnectionTimedOut = 3)。

的InnerException: {System.Exception的:A連接嘗試失敗,因爲連接的方沒有正確一段時間後響應或已建立的連接失敗,因爲連接的主機沒有反應。 (例外從HRESULT:0x8007274C)}

我可以依靠內部異常消息並從那裏取回HRESULT?

有沒有其他的方法來獲得想要的結果?

回答

1

您購買的AggregateException,因爲它正在從一個async方法

生成所以,是的,你必須檢查InnerExceptionHResult

SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult); 

這會給你所需的輸出。

0

根異常是AggregateException(它是一個.NET級異常),它通常是從另一個線程拋出異常的包裝異常。在這種情況下,這是因爲您使用了在線程池中運行的「ConnectAsync」方法。

因此,要獲得正確的套接字狀態,應該使用從Windows運行時級別拋出的InnerException。