2011-01-20 3 views
3

나는이 다음과 같습니다 TCP 클라이언트에 대한 리스너하는 방법C#을 예외가 catch되지

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(); 
     } 
    } 

이 게임 서비스를하지만 난 내 로그를 확인할 때, 나는 가끔이 오류를 참조하십시오 상기 파일 라인 (141)은

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 

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

I는 것을 발견이다 NotSupported를 예외가이 오류를 던지고 있지만 왜 통과합니까? 왜 무시되지 않지만 정상적인 Exception 핸들러를 통해 빠져 나옵니까?

편집 : 아무도 내가이 예외를 호출 할 수있는 방법을 알고 있습니까? 언제 발생합니까? 나는 로그에서 다른 사용자에게 돌아 오는 것을 보았지만 언제 일어나는지는 모른다.

+5

내가이 코드에서 해결할 첫 번째 것은 예외의 큰 덩어리를 삼키는 중지하는 것입니다. 로거 시스템을 가지고 있기 때문에 왜 트레이스없이 가장 관련성 높은 예외를 적극적으로 삼키는가? –

+0

더 이상 동의 할 수 없습니다! 왜이 세상에서 당신은 당신의 모든 사랑스러운 예외에 대해 이것을하고 있습니까? 당신을 도울 수있는 곳입니다! –

답변

4

NetworkStream.ReadInvalidOperationException이므로 (문서와 달리) NotSupportedException이 아닙니다. 당신은 리플렉터에서 이것을 확인할 수 있습니다 : 당신이 그것에 대해 뭔가를하고 복구 할 수있는 100 % 확신하지 않는 한

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

감사합니다.이 문제가 해결되기를 바랍니다. – YesMan85

0

이제까지 가 예외를 삼키는하지 마십시오. 모든 예외를 삼키는 것은 어떤 일이 생기 든 을 의미합니다. 프로그램을 복구하고 계속할 수 있습니다. OutOfMemoryException 또는 StackOverflowException 인 경우이를 정상적으로 처리 할 수 ​​있습니까? 예 로그 예외지만, 하나님의 사랑을 위해, 그것을 다시 던져 그것의 일을하자 :)

관련 문제