为什么这个SocketException没有被一般的catch例程捕获?

时间:2010-02-08 15:29:48

标签: c# try-catch socketexception

我们公司为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块之外抛出。

为什么它不起作用的任何想法?

4 个答案:

答案 0 :(得分:1)

如果ErrorEvent确实引发了另一个异常(根据评论),则永远不会执行DoDisconnect()

否则,您看到的异常可能来自DoDisconnect()

答案 1 :(得分:0)

您可以发布DoConnect()代码吗?

还要尝试的事情: 你能在DoConnect()中找到它吗? 尝试捕获特定的异常,而不仅仅是泛型。 如果使用调试模式,它会如何反应?

答案 2 :(得分:0)

您的timClock_TimerCallback未在catch-statement要捕获异常的同一线程中调用。您应该在timClock_TimerCallback中捕获异常,然后调用一个调用自身的方法,然后在右侧线程中重新抛出异常。

不确定这会有效,但你可以尝试一下。

答案 3 :(得分:0)

我写了一个小程序并且无法重现,在TimerCallback中捕获了SocketException就好了。

所以我建议你重新考虑你的分析,问题可能不是你认为的那样。一些建议:

  • 在Timer外面运行它。 T | hat将线程带出循环。
  • 在调试器中运行它。异常真的发生在哪里?
  • 逐步完成异常处理。 ErrorEvent正在做它应该做的事情吗?