我正在尝试连接到Socket并且我遇到了一个相当奇怪的错误。这个方法第一次被调用它会运行正常,如果服务器不合理地关闭或断开此客户端,那么下次这个代码运行时它不会告诉我它是成功还是失败?
我在调试模式下运行它并没有到达try块中的日志,它也没有到达throw
或登录catch块,这里发生了什么?
我知道我的日志方法有效,因为它在第一次运行此代码时运行得非常好。
try
{
_socket.Connect(new IPEndPoint(IPAddress.Parse(host), port));
CoreUtilities.LogToConsole("Successfully established a connection to the server.");
}
catch (SocketException socketException)
{
if (socketException.SocketErrorCode == SocketError.ConnectionRefused)
{
CoreUtilities.LogToConsole("Failed to establish a connection with the server.");
_reconnect = true;
}
else
{
throw;
}
}
我也有一个finally块,但我认为这与此错误无关。
finally
{
if (_socket.Connected && CoreUtilities.IsConnected(_socket))
{
_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, OnIncomingData, _socket);
Send(new SocketPasswordComposer(_session.ConfigHandler["server.password"]));
}
if (!_hasConnected)
{
var timer = new Timer
{
Interval = 10000
};
timer.Elapsed += ElapsedTimer;
timer.Enabled = true;
}
_hasConnected = true;
}
答案 0 :(得分:1)
在代码没有错误之前,不要连接语句或尝试特定的错误处理。
int step = 0;
try
{
step = 1;
var parsed = IPAddress.Parse(host);
step = 2;
var endpoint = new IPEndPoint(parsed, port);
step = 3;
_socket.Connect(endpoint);
step = 4;
CoreUtilities.LogToConsole("Successfully established a connection to the server.");
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Step " + step.ToString());
}
如果您收到消息框显示"步骤4",问题在于您没有显示代码的自定义 CoreUtilities.LogToConsole 代码。
答案 1 :(得分:0)
你正在抓住一个特定的例外。可能抛出的东西是不同的东西。在catch块之后添加这样的东西:
catch (Exception otherException)
{
CoreUtilities.LogToConsole(otherException.Message);
ExceptionDispatchInfo.Capture(otherException).Throw(); // this is better than just "throw;"
}
答案 2 :(得分:0)
可能,因为您只捕获SocketException类型的异常,如果有任何其他类型的异常被引发,它将不会被捕获。