Frage

Dies ist der Code, den ich zu Setup verwenden, um mein TCP-Server

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

Wenn Sie Bind auf demselben Ziel nennen erhalten Sie eine Ausnahme erhalten, weil der Port bereits verwendet wird, so bekomme ich diese Ausnahme, wenn ich dieser Funktion zweimal aufrufen.

Problem - Nach dem Fang {} Anweisung des Code der schließlich folgt weiter {}, obwohl ich die Ausnahme gefangen, warum das passiert? Ich will es die Funktion verlassen, nachdem die messagebox.I mit „return“ versucht, aber es bleibt immer noch der finally {} -Block folgen.

War es hilfreich?

Lösung

Der Block schließlich immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder das Verfahren innerhalb des try / catch-Block wurde zu verlassen.

Andere Tipps

Der Schließlich Block ist, wo Sie Code zu setzen, die unabhängig von ausgeführt werden muss, ob der try-Block erfolgreich ist oder fehlschlägt. Es ist, wo würden Sie „aufzuräumen“ Code setzen, die Objekte usw. entsorgen könnten.

Es ist also für-Design, das dieser Code ausgeführt wird, unabhängig davon, was passiert ist. Vielleicht müssen Sie diesen Code in den Try-Block bewegen, wenn Sie nur wollen, läuft es, wenn der Bind gut ist.

Sehen Sie hier ...

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

... für Details, wie das funktioniert.

Eine Probe try / catch / folgt schließlich (von Jeffery Richter CLR via C # genommen, die auf Ihrer erforderliche Lesung sein sollen) ...

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

Wie andere haben darauf hingewiesen, wird der finally Block immer dann auftreten, unabhängig davon, eine Ausnahme ausgelöst wird.

Ändern Sie Ihren Code

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

Die ganze Idee mit finally ist, dass es immer ausgeführt wird - Ausnahmen oder keine Ausnahmen. Verwenden Sie es für clean-up etc.

Schließlich Blöcke werden immer ausgeführt. Das ist der springende Punkt schließlich.

Es klingt wie die Zeilen, die Sie in dem ‚endlich‘ haben vielleicht in dem versuchen gehört?

schließlich wird immer ausgeführt.

Nur der Code, der nach der Codezeile vorhanden ist, der die Ausnahme throwed nicht ausgeführt werden, bis eine Fang Ausnahme angetroffen wird, dass die Ausnahme abfangen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top