0

这是我用来设置 TCP 服务器的代码

    internal void Initialize(int port,string IP)
    {
        IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
        Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            _Accpt.Bind(_Point);
        }
        catch (SocketException exc)
        {
            System.Windows.Forms.MessageBox.Show(exc.Message);

        }
        finally
        {
            _Accpt.Listen(2); //Second exception is here after the code continues after the catch block
            _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
        }
    }

如果你在同一个目的地调用 Bind,你会得到一个异常,因为端口已经在使用中,所以当我调用该函数两次时,我会得到那个异常。

问题 - 在 Catch{} 语句之后,即使我捕获了异常,代码仍继续遵循 finally{},为什么会发生这种情况?我希望它在消息框之后退出函数。我尝试使用“return”,但它仍然继续跟随 finally{} 块。

4

6 回答 6

3

finally 块总是执行,无论是否抛出异常或方法是否从 try/catch 块中退出。

于 2009-04-30T10:06:38.947 回答
2

finally 块是放置代码的地方,无论 try 块是成功还是失败,都必须运行。这是您放置可能处理对象等的“清理”代码的地方。

因此,无论发生什么,此代码都会运行是设计使然。如果您只希望在 Bind 良好时运行该代码,则可能需要将该代码移动到 Try 块中。

看看这个页面...

http://msdn.microsoft.com/en-us/library/6dekhbbc(VS.80).aspx

...有关其工作原理的详细信息。

下面是一个示例 try/catch/finally(通过 C# 取自 Jeffery Richter 的 CLR,这应该是您需要阅读的内容)...

FileStream fs = null;

try
{
  fs = new FileStream(...)

  // process the data

}
catch (IOException)
{
  // inside this catch block is where you put code that recovers
  // from an IOException
}
finally
{
  // make sure the file gets closed
  if (fs != null) fs.Close();
}
于 2009-04-30T10:07:39.973 回答
2

正如其他人指出的那样,finally无论抛出异常,该块都会始终发生。

将您的代码更改为

    try
    {
        _Accpt.Bind(_Point);
        _Accpt.Listen(2); //Second exception is here after the code continues after the catch block
        _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
    }
    catch (SocketException exc)
    {
        System.Windows.Forms.MessageBox.Show(exc.Message);

    }
    finally
    {
        //Final logging
        //Disposal of initial objects etc...
    }
于 2009-04-30T10:10:58.453 回答
1

整个想法finally是它将始终运行 - 异常或没有异常。用于清理等。

于 2009-04-30T10:06:49.477 回答
1

finally 块总是被执行。这就是finally的重点。

听起来您在“终于”中的线条可能属于尝试?

于 2009-04-30T10:07:10.707 回答
1

finally 总是被执行。

只有在抛出异常的代码行之后存在的代码才会被执行,直到遇到可以捕获异常的catch异常。

于 2009-04-30T10:08:50.143 回答