سؤال

أنا أستخدم Enerjy (http://www.enerjy.com/) أداة محلل التعليمات البرمجية الثابتة على رمز Java الخاص بي. يخبرني أن السطر التالي:

System.err.println ("تجاهل قاعدة البيانات") ؛

سيء لأنه يستخدم system.err. الخطأ الدقيق هو: "java0267 استخدام system.err"

ما هو الخطأ في استخدام system.err؟

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

المحلول

إجابة قصيرة: تعتبر ممارسة سيئة لاستخدامها لأغراض التسجيل.

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

توفر أطراف التسجيل بدورها الطريقة المنظمة والمنطقية لتسجيل الأحداث ورسائل الخطأ الخاصة بك حيث يمكنها تخزين الرسالة في مواقع مختلفة مستمرة (ملف السجل ، سجل DB ، إلخ).

الأكثر وضوحا (وخالية من التبعيات الخارجية) اختراق القرار هو استخدام إطار تسجيل Java المدمج من خلال java.util.logging.Logger الفصل لأنه يقوم بإعادة توجيه أحداث التسجيل إلى وحدة التحكم افتراضيًا. فمثلا:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(أو يمكنك فقط إيقاف تشغيل خيار التحليل هذا)

نصائح أخرى

واصف خطأك هو:

قد يشير استخدام System.err إلى رمز التصحيح المتبقي أو رمز الغلاية. فكر في استخدام حزمة تسجيل كاملة الميزة مثل Apache Commons للتعامل مع تسجيل الأخطاء.

يبدو أنك تستخدم system.err لأغراض التسجيل ، وهذا هو دون المستوى الأمثل لعدة أسباب:

  • من المستحيل تمكين التسجيل في وقت التشغيل دون تعديل التطبيق الثنائي
  • لا يمكن التحكم في سلوك التسجيل عن طريق تحرير ملف التكوين
  • بفعالية كثيرة أخرى

بينما أتفق مع النقاط المذكورة أعلاه حول استخدام إطار تسجيل ، ما زلت أميل إلى الاستخدام System.err الإخراج في مكان واحد: داخل الخطافات المغلقة. هذا لأنني اكتشفت ذلك عند استخدام java.util.logging لا يتم عرض عبارات سجل الإطار دائمًا في حالة حدوثها في خطافات مغلقة. هذا لأن مكتبة التسجيل تحتوي على خطاف إيقاف التشغيل الخاص بها لتنظيف ملفات السجل والموارد الأخرى ، ولأنك لا تستطيع الاعتماد على الترتيب الذي تعمل فيه خطافات الإغلاق ، لا يمكنك الاعتماد عليها java.util.logging بيانات العمل كما هو متوقع.

تحقق من هذا الرابط (قسم "التعليقات") لمزيد من المعلومات حول هذا.

http://weblogs.java.net/blog/dwalend/archive/2004/05/shutdown_hooks_2.html

(من الواضح أن البديل الآخر هو استخدام إطار تسجيل مختلف.)

System.ERR هو في الحقيقة أكثر لأغراض تصحيح الأخطاء أكثر من أي شيء آخر. الاستثناءات المناسبة معالجة الأخطاء والتعامل معها بطريقة أكثر سهولة في الاستخدام مفضلة. إذا كان من المفترض أن يرى المستخدم الخطأ ، فاستخدم system.out.println بدلاً من ذلك.

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

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

System.ERR و System.out للتطبيقات غير المترتبة على الإطلاق لم يشهده المطور الذي يقوم بتشغيل الكود في IDE ، وقد تضيع المعلومات المفيدة إذا تم تشغيل العنصر في الإنتاج.

system.err.println و system.out.println يجب عدم استخدامها كضغوط تسجيل الدخول. تم كتابة STD-Optput و STD-error (يتم كتابتها بواسطة System.out و .err) للرسائل من أدوات سطر الأوامر.

System.err يطبع إلى وحدة التحكم. قد يكون هذا مناسبًا للاختبار للطلاب واجباته المنزلية ، ولكنه سيكون غير مناسب لتطبيق حيث لن يتم رؤية هذه الرسائل (وحدة التحكم تخزن فقط العديد من الخطوط).

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

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