проблема в постановке попытки - PullRequest
0 голосов
/ 30 апреля 2009

Это код, который я использую для настройки моего 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 {}, хотя я поймал исключение, почему это происходит? Я хочу, чтобы он выходил из функции после окна сообщения. Я пытался выполнить команду «return», но он все еще продолжает следовать за блоком finally {}.

Ответы [ 6 ]

3 голосов
/ 30 апреля 2009

Блок finally всегда выполняется независимо от того, было ли выброшено исключение или метод выходил из блока try / catch.

2 голосов
/ 30 апреля 2009

Как уже отмечали другие, блок 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...
    }
2 голосов
/ 30 апреля 2009

Блок «В конце» - это место, куда вы помещаете код, который ДОЛЖЕН выполняться независимо от того, успешно ли выполняется блок try. Это место, где вы можете поместить «очистить» код, который может уничтожить объекты и т. Д.

Таким образом, этот код работает независимо от того, что произошло. Возможно, вам нужно переместить этот код в блок Try, если вы хотите, чтобы он работал только при хорошем Bind.

Проверить эту страницу ...

http://msdn.microsoft.com/en-us/library/6dekhbbc(VS.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();
}
1 голос
/ 30 апреля 2009

наконец всегда выполняется.

Только тот код, который существует после строки кода, выдавшей исключение, не будет выполняться, пока не будет обнаружено исключение catch, которое может перехватить исключение.

1 голос
/ 30 апреля 2009

Наконец блоки всегда выполняются. Вот и весь смысл окончательно.

Звучит так, как будто строки, которые есть у вас в 'finally', могут относиться к попытке?

1 голос
/ 30 апреля 2009

Вся идея finally заключается в том, что он всегда будет работать - исключения или нет исключений. Используйте его для очистки и т. Д.

...