2011-01-20 106 views
3

我有是一個TCP客戶端偵聽器,看起來像這樣的方法:C#的異常沒有被捕獲

private static void ProcessClient(
     Object obj) 
    { 
     ISession session = (ISession)obj; 
     NetworkStream networkStream = null; 

     try 
     { 
      DebugUtility.SetThreadName("Worker: {0}", session.Name); 
      networkStream = session.TcpClient.GetStream(); 
      networkStream.ReadTimeout = Config.ReadTimeout; 

      // Loop received packets (blocks untill next packet) 
      Int32 packetSize; 
      Byte[] buffer = new Byte[session.PacketSize]; 
      while ((packetSize = networkStream.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       // Get String from packet bytes 
       String packet = Encoding.UTF8.GetString(buffer, 0, packetSize); 

       // Check if packet has data 
       if (String.IsNullOrEmpty(packet)) 
        continue; 

       // Log biggest received package 
       DebugUtility.CheckMaxPacketSize(session.Name, packet.Length); 

       // Handle packet (in new thread) 
       Logger.DebugLog("Received: {0}", packet); 
       ThreadPool.QueueUserWorkItem(session.HandlePacket, packet); 
      } 
     } 
     catch (ObjectDisposedException) { } 
     catch (NotSupportedException) { } 
     catch (TimeoutException) { } 
     catch (SocketException) { } 
     catch (IOException) { } 
     catch (Exception ex) 
     { 
      Logger.LogException(ex); 
     } 
     finally 
     { 
      if (networkStream != null) 
       networkStream.Close(); 

      if (session != null) 
       session.Disconnect(); 
     } 
    } 

這是一個遊戲服務,但是當我檢查我的日誌,我偶爾會看到這樣的錯誤:

System.Int32 Read(Byte[], Int32, Int32): The stream does not support reading. 
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at BusinessLayer.Listener.ListenerWorker.ProcessClient(Object obj) in C:\path\ListenerWorker.cs:line 141 Line: 0 

即上述文件和行141是

 while ((packetSize = networkStream.Read(buffer,.... 

現在我已經發現,notsupported時例外是拋出這個錯誤,但爲什麼它會通過?爲什麼它不被忽略,但它是否通過正常的Exception ex處理程序?

編輯:有誰知道我怎麼能調用這個異常?它什麼時候發生?我只看到它在我的日誌中回到其他用戶,但我不知道它何時發生。

+5

我會修復此代碼的第一件事是停止吞嚥你的例外的一大塊。既然你有一個記錄系統,爲什麼你會主動吞下最相關的例外而沒有任何痕跡呢? – 2011-01-20 11:42:27

+0

不能同意更多!你爲什麼要對所有可愛的例外做這件事 - 他們在那裏幫助你! – 2011-01-20 11:47:19

回答

4

因爲NetworkStream.Read拋出InvalidOperationException,而不是NotSupportedException(與文檔相反)。您可以從反光證實了這一點:

if (!this.CanRead) 
{ 
    throw new InvalidOperationException(SR.GetString("net_writeonlystream")); 
} 
0

永遠不要曾經吞下一個例外,除非你是100%肯定,你可以做一些事情,並從中恢復。吞吞所有例外意味着無論發生什麼您的程序可以恢復並繼續。如果它是一個OutOfMemoryException或一個StackOverflowException,那麼你可以編程處理這些優雅嗎?是的,記錄異常,但爲了上帝的愛,重新拋出它,並讓它做它的工作:)