C#SocketException不';不要被抓住

C#SocketException不';不要被抓住,c#,try-catch,socketexception,C#,Try Catch,Socketexception,我的代码中有一个非常奇怪的位置。我正在开发一个c#聊天客户端服务器应用程序。当我关闭服务器时,我希望客户端自动关闭。客户端正在使用StremReader从TcpClient对象读取数据。客户端处于while循环中,在该循环中,它读取一行(StreamReader.ReadLine()),然后使用它读取的行执行一些操作。 当serever关闭时,我也会关闭tcp连接服务器端。因此,我希望客户端看到由读线引起的SocketException,捕获它并退出。但例外情况不会被发现! 以下是客户端循环代码

我的代码中有一个非常奇怪的位置。我正在开发一个c#聊天客户端服务器应用程序。当我关闭服务器时,我希望客户端自动关闭。客户端正在使用StremReader从TcpClient对象读取数据。客户端处于while循环中,在该循环中,它读取一行(StreamReader.ReadLine()),然后使用它读取的行执行一些操作。 当serever关闭时,我也会关闭tcp连接服务器端。因此,我希望客户端看到由读线引起的SocketException,捕获它并退出。但例外情况不会被发现! 以下是客户端循环代码:

 while (true)
 {
     try
     {
          ricev = read.ReadLine();
     }
     catch(SocketException exc)
     {
         //It never gets in here
     }
     chat.Invoke(showMessage, ricev);
 }
当我关闭服务器时,visual studio告诉我System.dll中出现了“System.Net.Sockets.SocketException”第一次意外异常,但我无法捕获它。为什么会这样?我还尝试用一个

catch
{
}
块,但这也不起作用

任何帮助都将不胜感激

编辑:在尝试了更多次之后,我发现SocketException根本没有被引发。这太奇怪了,正如我在一篇评论中所说,在相反的情况下,当客户端在服务器之前关闭时,会引发异常,我可以控制它。
我真的不知道发生了什么…

如果我很了解您,那么场景是当您在
TcpListener
object“
\u server.Stop()
”上调用
Stop
方法时,它不会在流上调用
Read
时在客户端抛出
SocketException
。。。我不知道为什么会这样,但我有一个工作基础。通过访问
TcpListener
上的底层
Socket
,并在其上调用
Shutdown

_server.Stop();
_server.Server.Shutdown(SocketShutdown.Both);//now at your "read.ReadLine();" will throw SocketException
编辑:您在评论中指出:

实际上,我正在关闭侦听器在accept方法上返回的tcpclient。connClient.Close()


如果您正在停止
tcpListerner
\u server.Stop()
”,然后关闭从
\u server.AcceptTcpCleint()方法获取的
客户端
,然后在at
读取器.ReadLine()处
将引发
IOException:无法从传输连接读取数据:对WSACancelBlockingCall的调用中断了阻塞操作
我自己进行了测试。

如果您正在调用
Invoke
,异常很可能会被包装在一个
TargetInvocationException

中,这是因为.Net对发送/接收方法使用了不安全的方法。您必须处理程序Coontext的
未处理的异常

VisualStudio告诉我“System.Net.Sockets.SocketException” System.dll中出现第一次意外异常,但我无法捕获 信息技术为什么会这样

调试器会截获第一次出现的异常并中断您的操作。这是第二次机会例外,让你进入你的捕获块,这就是为什么你没有进入你的
catch
块的第一次机会。有关更多信息,请参见此

摘自我上面提到的文章

第一次机会异常是否意味着代码中存在问题?第一次机会异常消息通常并不意味着存在问题 代码中的问题。适用于处理 异常非常优雅,第一次机会异常消息允许 开发人员知道遇到了异常情况,并且 处理


另一方面,您可以始终将调试器配置为在第一次出现异常时不会停止。

当您关闭服务器套接字时,另一端会收到一条零字节的消息。这表示服务器已正确关闭:

如果远程主机使用Shutdown方法关闭套接字连接,并且已收到所有可用数据,则Receive方法将立即完成并返回零字节

只有在异常情况下才会引发异常—例如,当客户端连接到服务器计算机时重新启动服务器计算机—而不是正常的程序流

ReadLine()
操作也不应引发异常,而应在发生这种情况时简单地返回
null

返回值

输入流的下一行,如果到达输入流的末尾,则为null


我以前遇到过这个问题,结果发现我一直在激活“当CLR异常抛出时中断,并且没有取消选中它”

所以,您的检查并没有通过
按Alt+Ctr+E 向下滚动到公共运行时语言异常,并确保取消选中“抛出”复选框。
我希望这对您有所帮助。

您是否在调试器中运行此功能?第一次机会异常是抛出异常但可能被捕获。第二次机会异常是当它没有被捕获并终止程序时。你是在玩VS吗?或者独立运行?应该可以。调试+异常,勾选CLR异常的抛出框。等待调试器中断并开始单步执行以查看其不起作用的原因。请尝试添加catch(Exception e)子句,并查看它是否在调试模式下运行此内部VS时被捕获。我已经尝试使用catch(异常e),但也不起作用。它是否在
StreamReader
的构造函数中中断了?不,实际上我正在关闭侦听器在accept方法上返回的tcpclient。conncclient.Close()。这是关闭连接的正确方法吗?从VisualStudio中的文档中可以看出,close方法释放TcpClient的任何资源,并要求关闭底层连接。我错了吗?无论如何,我一定会尝试关闭插座,看看是否有效,谢谢你的帮助advice@l.moretto:如果您
关闭侦听器在accept方法上返回的tcpclient。conncclient.Close()
然后它将在
rea处抛出
IOException