c# - 为什么 throw 会导致我的程序崩溃但 return 不会?

标签 c# error-handling tcpclient

我正在 try catch 我的表单客户端无法在 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;程序立即退出,没有错误。

有人知道这里发生了什么吗?

编辑:我不明白为什么我的投票率如此之低。我展示了我如何 try catch 这些异常并询问它们为什么不能正常工作。我认为问题可能是(不确定,只是想出了这个)因为在异步回调中,因为它是线程池中的一个新线程,调用 throw;不做任何事情,因为它不是同步的,所以没有什么可以退回,应用程序就会死掉。即使有了这些知识,我也不确定如何解决这个问题,除非我对整个程序进行某种 try catch 。

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

最佳答案

发生的事情是 EndConnect没有发生在与您的 BeginConnect 相同的线程上.当EndConnect抛出异常,它被工作线程的未处理异常处理程序捕获,该处理程序快速失败(另一种选择是它被忽略并且您永远不会发现您的代码不起作用)。

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

关于c# - 为什么 throw 会导致我的程序崩溃但 return 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550418/

相关文章:

Android Java TCP 客户端服务器文件传输

C# 套接字和多线程

C#6 重载决议 Func<T1> & Func<T2>

c# - fxcop 自定义规则 - 检查源代码以查找新关键字

c# - 在 JSON 中引用 C# 对象

javascript - HTML5 表单验证——错误信息自定义

python - 如果没有接收数据并且数据长度未知,如何在python中中断while循环[TCP]

c# - Office 加载项项目、dll 和 app.config 文件问题

scala - 为什么可以将 Try[Try[Unit]] 值分配给 Try[Unit]?

c++ - 当 C++ 在 unix 中调用错误时停止所有 makefile 操作