проблема в инструкции 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);
}
}
Если вы вызовете Bind в том же пункте назначения, вы получите исключение, потому что порт уже используется, поэтому я получаю это исключение, когда вызываю эту функцию два раза.
Проблема - После оператора Catch{} код продолжает следовать за Finally{}, хотя я поймал исключение, почему это происходит?Я хочу, чтобы он завершал работу функции после messagebox .Я пробовал с помощью "return", но он по-прежнему продолжает следовать за блоком finally{}.
Решение
Блок finally выполняется всегда, независимо от того, было ли сгенерировано исключение или метод выходил из блока try / catch.
Другие советы
Блок Finally - это место, куда вы помещаете код, который ДОЛЖЕН выполняться независимо от того, будет ли блок try успешным или неудачным.Это место, куда вы бы поместили "очищающий" код, который может удалять объекты и т.д.
Таким образом, изначально этот код выполняется независимо от того, что произошло.Возможно, вам нужно переместить этот код в блок Try, если вы хотите, чтобы он запускался только при правильной привязке.
Загляните на эту страницу...
http://msdn.microsoft.com/en-us/library/6dekhbbc (ПРОТИВ 80).aspx
...подробнее о том, как это работает.
Ниже приведен пример try / catch /finally (взят из CLR Джеффри Рихтера через C #, который должен быть в вашем обязательном чтении)...
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
заключается в том, что он будет выполняться всегда - с исключениями или без исключений.Используйте его для уборки и т.д.
Конечные блоки всегда выполняются.В этом весь смысл "наконец".
Похоже, строчки, которые у вас есть в "наконец-то", возможно, относятся к "попытке"?
finally всегда выполняется.
Только код, который существует после строки кода, вызвавшей исключение, не будет выполнен, пока не будет обнаружено исключение catch, которое может перехватить исключение.