Pregunta

Este es el código que utilizo para configurar mi servidor 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);
        }
    }

Si llamas a Bind en el mismo destino, obtendrás una excepción, porque el puerto ya está en uso, así que obtengo esa excepción cuando llamo a esa función dos veces.

Problema: después de la declaración de captura {}, el código continúa siguiendo la Finalmente {}, aunque detecté la excepción, ¿por qué sucede eso? Quiero que salga de la función después del cuadro de mensaje. Lo intenté con " return " pero aún continúa siguiendo el bloque finalmente {}.

¿Fue útil?

Solución

El bloque finally siempre se ejecuta, sin importar si se lanzó una excepción o si el método salió del bloque try / catch.

Otros consejos

El bloque Finally es donde colocas el código que DEBE ejecutarse, independientemente de si el bloque try tiene éxito o falla. Es donde pondrías " limpiar " código que podría disponer objetos, etc.

Por lo tanto, es por diseño que este código se ejecuta independientemente de lo que sucedió. Tal vez necesite mover ese código al bloque Try si solo quiere que se ejecute cuando el Bind es bueno.

Echa un vistazo a esta página ...

http://msdn.microsoft.com/ en-us / library / 6dekhbbc (VS.80) .aspx

... para detalles sobre cómo funciona esto.

A continuación se muestra una prueba / captura / finalmente (tomada de CLR de Jeffery Richter a través de C # que debería estar en su lectura requerida) ...

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();
}

Como han señalado otros, el bloque finally siempre ocurrirá independientemente de que se haya lanzado una excepción.

Cambia tu código a

    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...
    }

La idea general con finalmente es que siempre se ejecutará, con excepciones o sin excepciones. Úsalo para la limpieza, etc.

Finalmente los bloques se ejecutan siempre. Ese es todo el punto del fin.

¿Parece que las líneas que tienes en el 'finalmente' pueden pertenecer al intento?

finalmente siempre se ejecuta.

Solo el código que existe después de la línea de código que lanzó la excepción no se ejecutará, hasta que se encuentre una excepción de captura que pueda atrapar la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top