为什么这个 SocketException 没有被通用 catch 例程捕获?

Tar*_*haf 5 c# try-catch socketexception

我们公司为 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();
    }
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,在 DoConnect() 例程内部抛出了 SocketException(并且未被捕获)。我认为,catch(异常 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)
}
Run Code Online (Sandbox Code Playgroud)

该文档确认 SocketException 扩展了 Exception。显示的堆栈跟踪是:

TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
Run Code Online (Sandbox Code Playgroud)

因此异常不会抛出到 try/catch 块之外。

有什么想法为什么它不起作用吗?

Hen*_*man 0

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

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

  • 在计时器之外运行它。这使得线程脱离了循环。
  • 在调试器中运行它。异常真正发生在哪里?
  • 单步执行异常处理。ErrorEvent 是否做了它应该做的事情?