更好的读入流数据的方法,而不用将整个内容包装在一个空的try catch中

本文关键字:包装 一个 catch try 数据 方法 更好 | 更新日期: 2023-09-27 18:08:53

正在做这样的事情:

try
{
    while ((bytesRead = clientStream.Read(data, 0, data.Length)) != 0)
    {
        string message = Encoding.ASCII.GetString(data, 0, bytesRead) + Environment.NewLine;
        txtLog.Invoke(c => c.AppendText(message));
    }
}
catch
{
}

可以,但是很难看。

我知道人们会说不要捕获所有异常,至少在异常发生时做点什么,但我正在编写一个服务器应用程序。如果用户突然断网,也没关系。它不需要被记录。此外,我从不希望程序崩溃,所以捕获所有异常真的那么糟糕吗?程序仍然可以恢复。在while循环之后,执行这段代码,一切正常。对吧?:

string clientIdentifier = tcpClient.Client.RemoteEndPoint.ToString();
bool clientRemoved = clients.TryRemove(clientIdentifier);
if (clientRemoved)
{
    listUsers.Invoke(c => c.Items.Remove(clientIdentifier));
}
tcpClient.Close();

并不是在问一个具体的问题,更多的是想知道这是否可以,如果不行,有什么更好的方法来处理用户突然断开连接或任何其他形式的读取错误?

更好的读入流数据的方法,而不用将整个内容包装在一个空的try catch中

并不是在问一个具体的问题,更多的是想知道这是否可以,如果不行,有什么更好的方法来处理用户突然断开连接或任何其他形式的读取错误?

捕获IOException,而不捕获其他的(其他的表示代码中的错误,您不想吞下它们)。Exception.InnerException告诉您发生了什么,如果内部异常是SocketException,则可以检查SocketException.ErrorCode以获得具体细节。

还请注意,您可以检查NetworkStream.CanRead以查看流是否可读(是的,用户可以在NetworkStream.CanRead返回true之后但在执行读取之前突然关闭)。您仍然应该将NetworkStream.Read包装在try/catch中,但请注意,如果NetworkStream.CanRead为假,则可以避免异常。

代替Try, catch块,您可以使用Using块。但是你不能在using块中得到异常除非你再次显式地使用try catch。捕捉异常并不坏,但什么都不做和吞下是坏的。

但是,根据你的代码,请使用finally块来关闭所有的对象流,而不是仅仅使用catch。