-
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);
}
}
동일한 대상에서 BIND를 호출하면 포트가 이미 사용 중이므로 예외가 발생합니다. 따라서 해당 기능을 두 번 호출 할 때 해당 예외가 발생합니다.
문제 - CATCH {} 문 후 코드는 예외를 잡았음에도 불구하고 코드가 계속 마침내 {}를 따릅니다. 왜 그런 일이 발생합니까? MessageBox 이후에 기능을 종료하기를 원합니다. "return"으로 시도했지만 여전히 마지막으로 {} 블록을 따릅니다.
해결책
예외가 발생했거나 방법이 시도/캐치 블록 내에서 종료되었는지 여부에 관계없이 최종 블록은 항상 실행됩니다.
다른 팁
마지막으로 블록은 시도 블록의 성공 여부에 관계없이 실행 해야하는 코드를 넣는 곳입니다. 객체를 처리 할 수있는 "정리"코드를 넣는 곳입니다.
따라서이 코드가 일어난 일에 관계없이 실행되는 것은 부정확합니다. 아마도 바인드가 좋을 때만 실행하기를 원한다면 해당 코드를 시도 블록으로 이동해야 할 수도 있습니다.
이 페이지를 확인하십시오 ...
http://msdn.microsoft.com/en-us/library/6dekhbbc(vs.80).aspx
... 이것이 어떻게 작동하는지에 대한 자세한 내용.
샘플 시도/캐치/마침내 다음 (필수 독서에 있어야하는 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
항상 실행됩니다 - 예외 또는 예외가 없습니다. 정리 등을 사용하십시오.
마지막으로 블록은 항상 실행됩니다. 그것이 마침내의 요점입니다.
'마침내'에있는 라인이 시도에 속한 것처럼 들리나요?
마지막으로 항상 실행됩니다.
예외를 던진 코드 행 후에 존재하는 코드 만 예외를 잡을 수있는 캐치 예외가 발생할 때까지 실행되지 않습니다.