problema nell'istruzione try
-
03-07-2019 - |
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 {}.
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.