不会将异常抛给父函数

时间:2013-03-03 02:56:58

标签: c# visual-studio debugging exception try-catch

我使用VS2012作为我的项目,我正在处理Socket异常,当服务器无法向目标机器发送消息但它发生的时候它无法发送msg(我已经把它放在trycatch中)调试器只是在catch块中断并说出来没有发送到父catch块的错误。如果我做错了,请告诉我。

    private void sendMessageToTarget(string Message, IPAddress targetAddress, int port)
    {
        TcpClient client = new TcpClient();
        IPEndPoint server = new IPEndPoint(targetAddress, OUT_MESSAGE_PORT);
        Thread senderThread = new Thread(new ThreadStart(delegate()
        {
            try
            {
                client.Connect(server);
                MemoryStream memstream = new MemoryStream();
                NetworkStream netstream = client.GetStream();
                byte[] sentString = Encoding.ASCII.GetBytes(Message);
                netstream.Write(sentString, 0, sentString.Length);
                memstream.Close();
                netstream.Close();
                client.Close();
            }
            catch (SocketException ex)
            {
                throw;
            }
        }));
        senderThread.Start();
    } // Sending Message Method

以上是我向目标发送消息的代码

try
{
      sendMessageToTarget("CONN_CHECKER", target, OUT_MESSAGE_PORT);
}
catch (Exception se)
{
      ConnectedUsers.Remove(target.ToString());
      UpdateConnectedUserToTeacher();
      if (NeedFollowStudents.Contains(target.ToString()))
      {
          NeedFollowStudents.Remove(target.ToString());
      }
      UserLostConnection(this, new EventArgs());
}

这是我希望执行操作的另一个函数中的方法。

2 个答案:

答案 0 :(得分:1)

从一个线程到另一个线程没有神奇的编组异常。甚至几乎保证senderThread.Start();之后的代码将在线程委托中的代码之前执行。

传递给Thread构造函数的函数成为新线程的顶级函数。如果此类函数抛出异常(与您一样),则此异常将转到AppDomain.UnhandledException事件,并且通常会终止应用程序。

您的选择

  • 恢复为同步代码(一个线程上的所有代码)
  • 使用现有的异步方法,通知您的代码有关操作结束的信息。取决于方法通知可以通过事件(类似于WebClient.DownloadStringAsync)或通过回调和调用EndXXXXX,如Socket.BeginSend
  • 使用async
  • 手动实现原始线程的同步和编组异常。

请注意,只有代码的同步版本才能以您希望的方式工作,所有其他使用多个线程的人都无法将异常返回到同一个“父函数”(使用async至少会允许您代码看起来你想要的方式,即使它不会以相同的方式工作)。

答案 1 :(得分:0)

这只是一个猜测,但我相信你应该只在父函数中放置一个Try / Catch,而不是在子函数中。发生异常时,它将显示在父方法中。编写它的方式将捕获子方法中的异常,它不会传递回父方法。

相关问题