Domanda

Questo è il codice che uso per configurare il mio server 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);
        }
    }

Se chiami Bind sulla stessa destinazione otterrai un'eccezione, perché la porta è già in uso, quindi ottengo quell'eccezione quando chiamo quella funzione due volte.

Problema - Dopo l'istruzione Catch {} il codice continua a seguire il carattere infine {} anche se ho riscontrato l'eccezione, perché succede? Voglio che esca dalla funzione dopo il messagebox. Ho provato con " return " ma continua ancora a seguire il blocco infine {}.

È stato utile?

Soluzione

Il blocco finally viene sempre eseguito, indipendentemente dal fatto che sia stata generata un'eccezione o che il metodo uscisse dal blocco try / catch.

Altri suggerimenti

Il blocco Infine è dove si inserisce il codice che DEVE essere eseguito indipendentemente dal fatto che il blocco try abbia esito positivo o negativo. È dove inseriresti " ripulisci " codice che potrebbe disporre oggetti ecc.

Quindi, è di progettazione che questo codice viene eseguito indipendentemente da quello che è successo. Forse devi spostare quel codice nel blocco Try se vuoi che funzioni solo quando il Bind è buono.

Dai un'occhiata a questa pagina ...

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

... per dettagli su come funziona.

Segue un esempio di prova / cattura / finalmente (tratto dal CLR di Jeffery Richter tramite C # che dovrebbe essere sulla lettura richiesta) ...

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

Come altri hanno sottolineato, il blocco infine si verificherà sempre indipendentemente dall'eccezione generata.

Cambia il tuo codice in

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

L'intera idea con finalmente è che funzionerà sempre - eccezioni o nessuna eccezione. Usalo per la pulizia ecc.

Infine i blocchi vengono sempre eseguiti. Questo è il punto centrale di finalmente.

Sembra che le linee che hai in "finalmente" possano appartenere al tentativo?

infine viene sempre eseguito.

Solo il codice esistente dopo la riga di codice che ha generato l'eccezione non verrà eseguito, fino a quando non viene rilevata un'eccezione catch che può intercettare l'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top