سؤال

ما هي الممارسة الجيدة للتعامل مع الأخطاء لموقع asp.net؟أمثلة؟شكرًا!

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

المحلول

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

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

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

ويمكنك استخدام المصدر المفتوح elmah (وحدات تسجيل خطأ ومعالجات) لASP صافي للقيام بذلك الخطأ المستوى الأعلى / العالمي اصطياد بالنسبة لك إذا كنت تريد.

elmah أنه يمكن إنشاء سجل الأخطاء التي يمكن عرضها على الرغم بسيط ل تكوين واجهة ويب. يمكنك أيضا تصفية أنواع مختلفة من الأخطاء ولها صفحات الخطأ المخصصة الخاصة بك لأنواع خطأ مختلفة.

نصائح أخرى

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

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

تفاصيل أكثر هنا: http://www.codeproject.com/KB/aspnet /JcGlobalErrorHandling.aspx

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

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

مثال على ما لا تفعل:

try
{
   ...
}
catch{}

ومطيع جدا إلا إذا كان لديك سبب وجيه لذلك.

ويجب عليك التأكد من أنك يمكن التقاط معظم الأخطاء التي تم إنشاؤها بواسطة التطبيق الخاص بك وعرض رسالة ودية للمستخدمين. ولكن بطبيعة الحال لا يمكنك التقاط جميع الأخطاء لأنه يمكنك استخدام الملف web.config وdefaultRedirect من قبل مستخدم آخر. آخر أداة قوية جدا لتسجيل الأخطاء هي ELMAH. سوف ELMAH تسجيل كافة الأخطاء الناتجة عن التطبيق الخاص بك وتظهر لك بطريقة قابلة للقراءة للغاية. توصيل ELMAH في التطبيق الخاص بك هو بهذه البساطة إضافة خطوط قليلة من التعليمات البرمجية في ملف web.config وربط التجمع. يجب عليك بالتأكيد تعطي ELMAH محاولة سيوفر لكم حرفيا ساعات وساعات من الألم.

http://code.google.com/p/elmah/

  1. قم بالتدوين بشكل دفاعي داخل كل صفحة عن الاستثناءات التي تتوقع حدوثها والتعامل معها بشكل مناسب، حتى لا يتم تعطيل المستخدم في كل مرة يحدث فيها استثناء.

  2. سجل كافة الاستثناءات، مع مرجع.

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

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

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

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

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