C # исключение не пойман - PullRequest
3 голосов
/ 20 января 2011

У меня есть метод прослушивания TCP-клиента, который выглядит следующим образом:

    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,....

Теперь я обнаружил, что NotSupportedException выдает эту ошибку, но почему она проходит?Почему это не игнорируется, но проходит через обычный обработчик Exception ex?

Редактировать: Кто-нибудь знает, как я могу вызвать это исключение?Когда это происходит?Я вижу, как это возвращается в моих журналах другим пользователям, но я не знаю, когда это произойдет.

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Поскольку NetworkStream.Read выбрасывает InvalidOperationException, а не NotSupportedException (вопреки документации).Вы можете подтвердить это с помощью рефлектора:

if (!this.CanRead)
{
    throw new InvalidOperationException(SR.GetString("net_writeonlystream"));
}
0 голосов
/ 21 января 2011

Никогда и никогда никогда не проглотит исключение, если вы не уверены на 100%, что можете что-то с этим сделать и восстановиться после него. Поглощение всех исключений подразумевает, что что бы ни случилось ваша программа может восстановиться и продолжить работу. Что, если это OutOfMemoryException или StackOverflowException, вы можете изящно обработать их? Да, запишите исключение, но ради любви к Богу, отбросьте его и позвольте ему делать свое дело:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...