سؤال

وهذا هو رمز يمكنني استخدامها لإعداد خدمة بلدي 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);
        }
    }

إذا كنت استدعاء ربط على نفس الوجهة التي سوف تحصل على استثناء، لأن المنفذ قيد الاستخدام بالفعل، لذلك يمكنني الحصول على هذا الاستثناء عندما أدعو أن وظيفة مرتين.

مشكلة - بعد اقبض {بيان} لا يزال رمز لمتابعة وأخيرا {} حتى ولو مسكت استثناء، لماذا يحدث ذلك؟ أريد أن الخروج من وظيفة بعد أن حاول messagebox.I مع "العودة"، لكنها لا تزال مستمرة لمتابعة كتلة وأخيرا {}.

هل كانت مفيدة؟

المحلول

وكتلة أخيرا ينفذ دائما، بغض النظر عما إذا كان طرح استثناء أو طريقة كانت تخرج من داخل كتلة حاول / catch.

نصائح أخرى

وأخيرا كتلة هو المكان الذي وضع التعليمات البرمجية التي يجب أن تعمل بغض النظر عن ما إذا كانت كتلة حاول ينجح أو يفشل. فمن حيث كنت وضعت "تنظيف" التعليمات البرمجية التي يمكن التخلص الأشياء وغيرها.

وهكذا، فإنه من كل تصميم أن يعمل هذا الرمز بغض النظر عما حدث. ربما تحتاج إلى نقل هذا الرمز في كتلة محاولة إذا كنت تريد فقط تشغيله عندما ربط جيدة.

وتحقق من هذه الصفحة ...

http://msdn.microsoft.com/ أون لنا / مكتبة / 6dekhbbc (VS.80) .aspx اتصال

... لمزيد من التفاصيل حول كيفية عمل ذلك.

وعينة حاول / صيد / أخيرا يلي (مأخوذة من CLR جيفري ريختر عبر C # التي ينبغي أن تكون على القراءة المطلوبة) ...

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

وكما أشار آخرون، فإن كتلة finally يحدث دائما بغض النظر عن استثناء التي القيت.

تغيير التعليمات البرمجية ل

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

والفكرة كلها مع finally هو أنه سيرشح نفسه دائما - استثناءات أو أية استثناءات. استخدامه لتنظيف الخ.

وأخيرا يتم تنفيذ كتل دائما. وهذا هو بيت القصيد من النهاية.

وهذا يبدو وكأنه خطوط لديك في 'أخيرا' ربما تنتمي في محاولة؟

وأخيرا يتم تنفيذ دائما.

وفقط رمز موجود بعد سطر من التعليمات البرمجية التي throwed لن يتم تنفيذ الاستثناء، حتى يتم اجه استثناء الصيد التي يمكن التقاط استثناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top