代码之家  ›  专栏  ›  技术社区  ›  Tarnschaf

为什么这个socketException不被一般的catch例程捕获?

  •  4
  • Tarnschaf  · 技术社区  · 16 年前

    我们公司为GUI应用程序提供网络组件(DLL)。

    它使用一个检查断开的计时器。如果它想重新连接,它会调用:

    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)
    }
    

    文档确认socketException扩展了异常。 显示的stacktrace是:

    TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
    

    因此,不会在try/catch块之外引发异常。

    你知道为什么它不起作用吗?

    4 回复  |  直到 16 年前
        1
  •  0
  •   Henk Holterman    16 年前

    我写了一个小程序,无法复制,一个socketexception在一个时间回调中被捕获了。

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

    • 在计时器外运行。T它将线程从循环中取出。
    • 在调试器中运行它。异常真正发生在哪里?
    • 单步执行异常处理。ErrorEvent应该做什么?
        2
  •  1
  •   Henk Holterman    16 年前

    如果 ErrorEvent 真的引发了另一个异常(根据注释),然后 DoDisconnect() 从未执行。

    否则,你看到的例外情况可能会出现 DODISCONTIONS()

        3
  •  0
  •   Roast    16 年前

    你能发布doconnect()代码吗?

    还有要尝试的事情: 你能在doconnect()中找到它吗? 尝试捕获特定的异常,而不仅仅是一般异常。 如果使用调试模式,它会做出什么反应?

        4
  •  0
  •   J. Random Coder    16 年前

    您的 timClock_TimerCallback 不是在catch语句要捕获异常的同一线程中调用的。您应该在内部捕获异常 时间时钟返回 然后调用一个调用自身的方法,然后在正确的线程中重新引发异常。

    不确定这是否可行,但您可以尝试一下。