为什么throw使我的程序崩溃,而return不崩溃?
本文关键字:崩溃 return 为什么 我的 程序 throw | 更新日期: 2023-09-27 18:09:54
我正试图捕获我的表单客户端无法在连接回调中建立与服务器的连接的异常:
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;
不做任何事情,因为,因为它不是同步的,没有什么可以扔回和应用程序死亡。即使有了这些知识,我也不知道如何解决这个问题,除非我在整个程序中添加某种try-catch。
我想一个解决方案可能只是坚持return;
,因为没有什么可以扔回去(由于方法的异步回调性质),而是引发一个事件,表明连接失败。无论如何,非常感谢你的点赞和帮助我解决这个问题。哦,等一下…
正在发生的事情是EndConnect
没有发生在与BeginConnect
相同的线程上。当EndConnect
抛出异常时,它被工作线程的未处理异常处理程序捕获,该异常处理程序快速失败(另一种选择是它被忽略,并且您永远不会发现您的代码不工作)。
你必须想出一种方法来告诉你的主窗体线程连接失败
正如其他人指出的那样,您需要以某种方式捕获异常以避免程序终止。
关于如何做到"全局"的一些想法,参见如何在。net应用程序中捕获所有异常/崩溃。这是否真的是一个好主意取决于你的程序的具体需求…
与WinForms相关:
不能单独根据你的问题来判断,但如果这实际上是一个WinForms应用程序,你可能需要认识到抛出异常的模态形式的行为差异,这取决于调试器是否活跃。假设我们有两种形式-第二种形式显示为第一个的模态子:
- 如果应用程序通过调试器启动,则关闭第二个窗体,并且堆栈展开一直到第一个窗体的catch块(如果有的话)。
- 如果应用程序在调试器外部启动,堆栈展开在第二窗体关闭之前停止,并显示通用异常消息。第二个窗体保持打开状态,并且永远不会到达第一个窗体中的catch块。