tryステートメントの問題
-
03-07-2019 - |
質問
これは、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);
}
}
ポートがすでに使用されているため、同じ宛先でバインドを呼び出すと例外が発生します。そのため、その関数を2回呼び出すと例外が発生します。
問題-Catch {}ステートメントの後、例外をキャッチしたにもかかわらず、コードは最終的に{}に従い続けます。 メッセージボックスの後に関数を終了させたいのですが、「return」で試しましたが、finally {}ブロックの後に続きます。
解決
例外がスローされたか、メソッドがtry / catchブロック内から終了したかに関係なく、finallyブロックは常に実行されます。
他のヒント
Finalブロックは、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();
}
他の人が指摘したように、スローされる例外に関係なく、 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...
}
finally
の全体的な考え方は、例外を実行するか例外を実行しないということです。クリーンアップなどに使用します。
最後に、ブロックは常に実行されます。それがついに重要なポイントです。
「最後に」持っているラインはトライに属しているようですね?
最終的には常に実行されます。
例外をスローできるコード行の後に存在するコードのみが、例外をキャッチできるキャッチ例外が発生するまで実行されません。