كيفية تنفيذ معالجة استثناء المستوى الأعلى؟

StackOverflow https://stackoverflow.com/questions/616759

  •  03-07-2019
  •  | 
  •  

سؤال

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

try
{
    // do main work
}
catch(Exception ex)
{
    // log exception info
}

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

لقد قمت بإزالة هذا المستوى الأعلى من المحاولة/الالتقاط على الأقل بينما كنت لا أزال أقوم بالبرمجة والاختبار.ولكن الآن انتهت مهمتي ويجب أن أقرر ما إذا كنت سأعيدها للإصدار أم لا.أعتقد أنني يجب أن أفعل ذلك، لأنه يجعل الخدمة أكثر استقرارًا، والمغزى من ذلك هو أنها تعمل في الخلفية دون الحاجة إلى أي إشراف.من ناحية أخرى قرأت أنه يجب على المرء فقط استدعاء استثناءات محددة (كما في IoException)، وليس بشكل عام Exception.

ما هي نصيحتك بشأن هذه المسألة؟

بالمناسبة، المشروع مكتوب بلغة C#، ولكنني مهتم أيضًا بإجابات اللغات غير .NET.

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

المحلول

قم باعادته.

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

التسجيل على ما يرام.

يمكنك أيضًا استخدام رمز DEBUG المحدد بواسطة Visual Studio لبناء تصحيح الأخطاء كعلامة.

    ...
    } catch( Exception e ) { 
#if DEBUG
          throw;
#else
          log as usual 
#endif
    }

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

نصائح أخرى

في أي تطبيق جافا، كنت ترغب فقط حول دائما لتحديد معالج استثناء للاستثناءات uncaught مع شيء من هذا القبيل:

Thread.setDefaultUncaughtExceptionHandler( ... );

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

وبالإضافة إلى القيام بذلك، فإن معظم المواضيع بلدي محاولة لديها / الصيد حيث سوف يمسك RunnableException (ولكن ليس Error) وتسجيل ذلك ... فإن بعض المواضيع يموت عندما يحدث هذا، والبعض الآخر سيقوم بتسجيل وتجاهل، والبعض الآخر سيتم عرض شكوى للمستخدم والسماح للمستخدم أن تقرر، اعتمادا على احتياجات الطلب. هذه المحاولة / المصيد هو في جذور جدا من الموضوع، في طريقة Runnable.run() أو ما يعادلها. منذ حاول / المصيد هو في جذر الموضوع، وليس هناك حاجة لتعطيل أحيانا هذا الصيد.

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

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

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

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

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

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