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 を呼び出すと、ポートが既に使用されているため、例外が発生します。その関数を 2 回呼び出すと、その例外が発生します。

問題 - Catch{} ステートメントの後、コードは例外をキャッチしたにもかかわらず、Finally{} に続くのはなぜですか? メッセージボックスの後に関数を終了させたい.「return」で試しましたが、まだfinally{}ブロックに続きます。

4

6 に答える 6

3

例外がスローされたか、メソッドが try/catch ブロック内から終了したかに関係なく、finally ブロックは常に実行されます。

于 2009-04-30T10:06:38.947 に答える
2

finally ブロックは、try ブロックが成功するか失敗するかに関係なく実行しなければならないコードを配置する場所です。オブジェクトなどを破棄する可能性のある「クリーンアップ」コードを配置する場所です。

したがって、何が起こってもこのコードが実行されるのは仕様です。バインドが良好な場合にのみ実行したい場合は、おそらくそのコードを 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の要点です。

「最終的に」にある行は、試行に属しているように聞こえますか?

于 2009-04-30T10:07:10.707 に答える
1

最終的に常に実行されます。

例外をキャッチできるキャッチ例外が発生するまで、例外をスローしたコード行の後に存在するコードのみが実行されません。

于 2009-04-30T10:08:50.143 に答える