C# 为什么throw会使我的程序崩溃,而return不会';T

C# 为什么throw会使我的程序崩溃,而return不会';T,c#,error-handling,tcpclient,C#,Error Handling,Tcpclient,我正在尝试捕获表单客户端无法通过连接回调建立与服务器的连接的异常: try { client.EndConnect(async); } catch (Exception e) { client.Close(); return; } 这很好,但是这个行为被封装到一个类中,所以我想调用throw而不是返回以便客户端类可以处理它,如下所示: try { client.Connect(host, port); } catch { Console.WriteLi

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

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

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

try
{
    client.Connect(host, port);
}
catch
{
    Console.WriteLine("Could not connect to: " + host + ":" + port.ToString());
}
那么为什么不直接调用
throw然后呢?嗯,出于某种原因,如果我调用
throw
抛出新异常()
,或者基本上是
返回以外的任何内容程序快速失败。我真的不知道是什么原因造成的。我尝试删除
client.Close()
查看是否是问题,但什么都没有。如果我不调用
返回程序立即退出,没有错误

有人知道这是怎么回事吗

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


我想一个解决方案就是坚持使用
return
因为没有什么可回送的(由于方法的异步回调性质),而是引发一个指示连接失败的事件。不管怎样,非常感谢反对票,并帮助我解决了这个问题。哦,等等…

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

有关如何“在全球范围内”做到这一点的一些想法,请参阅。这是否真的是一个好主意取决于你的计划的具体需要

与WinForms相关: 不能仅根据您的问题来判断,但如果这实际上是一个WinForms应用程序,您可能需要了解抛出异常的模态形式的行为差异,这取决于调试器是否处于活动状态。假设我们有两种形式——第二种形式显示为第一种形式的模态子形式:

  • 若应用程序是通过调试器启动的,那个么第二个窗体将关闭,堆栈展开将一直进行到第一个窗体的catch块(若有)
  • 若应用程序在调试器外部启动,堆栈展开将在关闭第二个窗体之前停止,并显示通用异常消息。第二个窗体保持打开,第一个窗体中的捕捉块永远不会到达

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

有关如何“在全球范围内”做到这一点的一些想法,请参阅。这是否真的是一个好主意取决于你的计划的具体需要

与WinForms相关: 不能仅根据您的问题来判断,但如果这实际上是一个WinForms应用程序,您可能需要了解抛出异常的模态形式的行为差异,这取决于调试器是否处于活动状态。假设我们有两种形式——第二种形式显示为第一种形式的模态子形式:

  • 若应用程序是通过调试器启动的,那个么第二个窗体将关闭,堆栈展开将一直进行到第一个窗体的catch块(若有)
  • 若应用程序在调试器外部启动,堆栈展开将在关闭第二个窗体之前停止,并显示通用异常消息。第二个窗体保持打开,第一个窗体中的捕捉块永远不会到达

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


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

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


你必须想出一种方法来告诉你的主窗体线程连接失败。

你是否捕获了你在某处抛出的异常?如果不是“是”,您的进程将被终止。伙计,每次抛出都必须在其他地方捕获。现在向我们展示调用和捕获异常的代码。为什么不在那里自己处理异常呢?你扔了之后还在抓吗?碎玻璃:我在代码里写了我在哪里抓的代码。第二个代码段就是我捕获它的地方。第一个是来自
client.Connect(主机、端口)中的异步回调调用。那么您是否捕获了您在某处抛出的异常?如果不是“是”,您的进程将被终止。伙计,每次抛出都必须在其他地方捕获。现在向我们展示调用和捕获异常的代码。为什么不在那里自己处理异常呢?你扔了之后还在抓吗?碎玻璃:我在代码里写了我在哪里抓的代码。第二个代码段就是我捕获它的地方。第一个是来自
client.Connect(主机、端口)中的异步回调调用。使用事件,它们似乎工作正常。在客户端代码中,我是否可以在Connect方法上使用try-catch?可能会