Question

C’est le code que j’utilise pour configurer mon serveur 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 vous appelez Bind sur la même destination, vous obtiendrez une exception car le port est déjà utilisé. Je reçois donc cette exception lorsque j'appelle cette fonction deux fois.

Problème - Après l'instruction Catch {}, le code continue de suivre le fichier Finally {} même si j'ai intercepté l'exception, pourquoi cela se produit-il? Je souhaite qu'il quitte la fonction après la boîte à messages.J'ai essayé avec "return", mais il continue à suivre le bloc finally {}.

Était-ce utile?

La solution

Le bloc finally s'exécute toujours, qu'une exception soit levée ou que la méthode quitte le bloc try / catch.

Autres conseils

Le bloc Finally est l'endroit où vous mettez du code qui DOIT être exécuté, que le bloc try réussisse ou non. C’est là que vous placerez "nettoyer". code qui pourrait éliminer des objets, etc.

Donc, c'est par conception que ce code fonctionne indépendamment de ce qui s'est passé. Peut-être devez-vous déplacer ce code dans le bloc Try si vous ne voulez le lancer que lorsque le Bind est bon.

Consultez cette page ...

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

... pour savoir comment cela fonctionne.

Vous trouverez ci-dessous un exemple de tentative / prise / finale (extrait du CLR de Jeffery Richter via C # qui devrait figurer sur votre lecture requise) ...

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

Comme d'autres l'ont déjà souligné, le bloc finally sera toujours utilisé quelle que soit l'exception déclenchée.

Modifiez votre code en

    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’idée avec finally est qu’il sera toujours exécuté - des exceptions ou aucune exception. Utilisez-le pour le nettoyage, etc.

Enfin, les blocs sont toujours exécutés. C’est l’intérêt d’enfin.

Cela ressemble aux lignes que vous avez dans le "enfin" peut-être appartenir à l'essayer?

enfin est toujours exécuté.

Seul le code qui existe après la ligne de code qui a généré l'exception ne sera pas exécuté jusqu'à ce qu'une exception catch pouvant intercepter l'exception soit rencontrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top