我们公司为GUI应用程序提供网络组件(DLL)。
它使用一个Timer来检查断开连接。如果要重新连接,则调用:
internal void timClock_TimerCallback(object state)
{
lock (someLock)
{
// ...
try
{
DoConnect();
}
catch (Exception e)
{
// Log e.Message omitted
// Raise event with e as parameter
ErrorEvent(this, new ErrorEventArgs(e));
DoDisconnect();
}
// ...
}
}
所以问题是,在DoConnect()例程内部抛出了SocketException(并没有被捕获)。我认为,catch(Exception e)应该捕获所有异常,但不知何故SocketException没有被捕获并显示给GUI应用程序。
protected void DoConnect()
{
//
client = new TcpClient();
client.NoDelay = true;
// In the following call the SocketException is thrown
client.Connect(endPoint.Address.ToString(), endPoint.Port);
// ... (login stuff)
}
doc证实SocketException扩展了Exception。 出现的堆栈跟踪是:
TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
因此异常不会在try / catch块之外抛出。
为什么它不起作用的任何想法?
答案 0 :(得分:1)
如果ErrorEvent
确实引发了另一个异常(根据评论),则永远不会执行DoDisconnect()
。
否则,您看到的异常可能来自DoDisconnect()
答案 1 :(得分:0)
您可以发布DoConnect()代码吗?
还要尝试的事情: 你能在DoConnect()中找到它吗? 尝试捕获特定的异常,而不仅仅是泛型。 如果使用调试模式,它会如何反应?
答案 2 :(得分:0)
您的timClock_TimerCallback
未在catch-statement要捕获异常的同一线程中调用。您应该在timClock_TimerCallback
中捕获异常,然后调用一个调用自身的方法,然后在右侧线程中重新抛出异常。
不确定这会有效,但你可以尝试一下。
答案 3 :(得分:0)
我写了一个小程序并且无法重现,在TimerCallback中捕获了SocketException就好了。
所以我建议你重新考虑你的分析,问题可能不是你认为的那样。一些建议: