4

我们公司为 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(而不是被捕获)。我会假设,捕获(异常 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 扩展了 Exception。出现的堆栈跟踪是:

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

所以异常不会在 try/catch 块之外抛出。

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

4

4 回答 4

1

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

否则,您看到的异常可能会出现DoDisconnect()

于 2010-02-08T15:36:52.360 回答
0

你能发布 DoConnect() 代码吗?

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

于 2010-02-08T15:37:48.577 回答
0

timClock_TimerCallback没有在与 catch 语句想要捕获异常的同一线程中调用。您应该在内部捕获异常timClock_TimerCallback,然后调用一个调用自身的方法,然后在正确的线程中重新抛出异常。

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

于 2010-02-08T15:49:34.660 回答
0

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

所以我建议你重新思考你的分析,问题可能不是你想的那样。几点建议:

  • 在定时器之外运行它。T|that 将线程从循环中取出。
  • 在调试器中运行它。异常真正发生在哪里?
  • 逐步完成异常处理。ErrorEvent 是否在做它应该做的事情?
于 2010-02-08T19:01:25.047 回答