나는이 다음과 같습니다 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 핸들러를 통해 빠져 나옵니까?
편집 : 아무도 내가이 예외를 호출 할 수있는 방법을 알고 있습니까? 언제 발생합니까? 나는 로그에서 다른 사용자에게 돌아 오는 것을 보았지만 언제 일어나는지는 모른다.
내가이 코드에서 해결할 첫 번째 것은 예외의 큰 덩어리를 삼키는 중지하는 것입니다. 로거 시스템을 가지고 있기 때문에 왜 트레이스없이 가장 관련성 높은 예외를 적극적으로 삼키는가? –
더 이상 동의 할 수 없습니다! 왜이 세상에서 당신은 당신의 모든 사랑스러운 예외에 대해 이것을하고 있습니까? 당신을 도울 수있는 곳입니다! –