为什么抛出我的程序崩溃但返回不?

时间:2011-09-26 03:32:42

标签: c# error-handling tcpclient

我正在尝试捕获我的表单客户端无法在Connect回调中无法与服务器建立连接的异常:

try
{
    client.EndConnect(async);
}
catch (Exception e)
{
    client.Close();

    return;
}

这很好但是这个行为被封装到一个类中,所以我想调用throw;而不是return;,以便客户端类可以处理它,如下所示:

try
{
    client.Connect(host, port);
}
catch
{
    Console.WriteLine("Could not connect to: " + host + ":" + port.ToString());
}

那么为什么不拨打throw;呢?好吧,出于某种原因,如果我拨打throw;throw new Exception();,或基本上除return;之外的其他任何内容,该程序都会失败。我真的不确定是什么导致了这一点。我尝试删除client.Close();,看看是不是问题,但没有。如果我不打电话return;,程序会立即退出并且没有错误。

任何人都知道这里发生了什么?

编辑:我不明白为什么我这么多被投票。我展示了我是如何尝试捕获这些异常并且问他们为什么不能正常工作。我认为问题可能是(不确定,只是提出这个),因为在异步回调中,因为它是ThreadPool中的新线程,所以调用throw;不会做任何事情,因为它不是同步的,没有什么可以回去的,应用程序就会死掉。即使有了这些知识,我也不确定如何解决这个问题,除非我对整个程序进行某种尝试。

我认为解决方案可能只是坚持使用return;,因为没有什么可以回退(由于方法的异步回调特性)而是引发一个指示连接失败的事件。无论如何,非常感谢downvotes并帮助我解决这个问题。哦等等......

2 个答案:

答案 0 :(得分:1)

发生的事情是EndConnect与您的BeginConnect在同一个帖子上没有发生。当EndConnect抛出异常时,它会被工作线程的未处理异常处理程序捕获,该异常处理程序快速失败(另一个选项是它被忽略,你永远不会发现你的代码不能正常工作)。

您必须想出一种方法来告诉主表单线程连接失败。

答案 1 :(得分:0)

正如其他人所指出的,你需要以某种方式捕获你的异常以避免程序终止。

有关如何“全球”执行此操作的一些想法,请参阅How to catch ALL exceptions/crashes in a .NET app。这实际上是一个好主意取决于您的计划的具体需求......

与WinForms相关:

无法单独根据您的问题判断,但如果这实际上是一个WinForms应用程序,您可能需要了解抛出异常的模态形式的行为差异,具体取决于调试器< / strong>是否有效。假设我们有两种形式 - 第二种形式显示为第一种形式的儿童:

  • 如果应用程序是通过调试器启动的,则第二个表单将被关闭,并且堆栈展开将一直到第一个表单的catch块(如果有的话)。
  • 如果在调试器外部启动应用程序,则在第二个表单关闭之前停止堆栈展开并显示一般异常消息。第二种形式保持打开状态,永远不会达到第一种形式的阻挡。