سؤال

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

ومعظم الأمثلة نظرت فقط الكتابة إلى وحدة التحكم باستخدام:

Console.WriteLine(ex.Message);

وهذا هو كل شيء بشكل جيد للغاية. ولكن في تطبيق حقيقي ماذا معظم المطورين تفعل؟

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

وبلدي وظيفة في الوقت الحالي ترجع باطلة. وأنا أتساءل فقط ماذا سوف أعود إذا كان webclient مشغول؟

وشكرا جزيلا لأية نصيحة،

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

المحلول

لا جذب استثناء إذا لم تتمكن من التعامل معها. إذا العودة فقط بعض القيمة، وطريقة الدعوة له للتحقق مما إذا كانت القيمة نتيجة حقيقية أو مجرد مؤشر استثناء. والآن هذه الطريقة يجب أن تقرر ما يجب القيام به والعودة. وطريقة يدعو هذا الأسلوب. وطريقة ...

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

إذا كنت ترغب في تسجيل شيء، استخدم نمط التالي لتسجيل استثناء لrethrow ذلك.

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

لاحظ أنه throw; وليس throw exception;. إذا قمت بذلك في وقت لاحق، تفقد تتبع المكدس الأصلي. إذا كنت يمكن أن نستنتج مزيد من التفاصيل حول سبب استثناء، يجب أن التفاف استثناء اشتعلت في استثناء أكثر وضوحا مع معلومات إضافية.

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

نصائح أخرى

ويجب عليك استخدام ex.ToString () طريقة

<اقتباس فقرة>   

وException.Message   يحتوي على وصف بسيط للاستثناء (على سبيل المثال "مرجع كائن لم يتم تعيين ...").

     

وException.ToString ()   يحتوي على وصف الاستثناء جنبا إلى جنب مع تتبع المكدس كاملة.

استثناء معالجة أفضل الممارسات في. NET

هل يمكن إعادة تشغيل الأسلوب إذا كان العميل هو مشغول ولكن الانتظار لبعض الوقت قبل إعادة المحاولة؟ مع احتمال فشل بعد إعادة المحاولة س.

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

ويعتمد على شدة الاستثناء.

وأود أن أقترح النظر في كتلة استثناء من أنماط وممارسات

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

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

scroll top