Вопрос

Это код, который я использую для настройки моего 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, которое может перехватить исключение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top