سؤال

أنا أعمل على تطبيق متعدد المنصات بلغة Java والذي يعمل حاليًا بشكل جيد على أنظمة التشغيل Windows وLinux وMacOS X.أحاول إيجاد طريقة لطيفة لاكتشاف (ومعالجة) "الأعطال".هل هناك طريقة سهلة عبر الأنظمة الأساسية لاكتشاف "الأعطال" في Java والقيام بشيء ردًا على ذلك؟

أعتقد أن كلمة "تعطل" أعني الاستثناءات التي لم يتم اكتشافها.ومع ذلك، يستخدم الكود بعض JNI لذا سيكون من الجيد أن تكون قادرًا على اكتشاف الأعطال من كود JNI السيئ، ولكن لدي شعور بأن هذا خاص بـ JVM.

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

المحلول

للتعامل البسيط مع ميزة استقبال الرسائل الخاطئة، يمكنك استخدام الطريقة الثابتة التالية في خيط.من جافادوك:

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

هذه طريقة واسعة جدًا للتعامل مع الأخطاء أو الاستثناءات التي لم يتم التحقق منها والتي قد لا يتم اكتشافها في أي مكان آخر.

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

نصائح أخرى

للتعامل مع الاستثناءات التي لم يتم اكتشافها، يمكنك توفير مجموعة ThreadGroup جديدة توفر تنفيذًا لـ ThreadGroup.uncaughtException(...).يمكنك بعد ذلك اكتشاف أي استثناءات لم يتم اكتشافها والتعامل معها بشكل مناسب (على سبيل المثال.إرسال سجل الأعطال إلى المنزل).

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

لست متأكدًا مما إذا كان هذا هو ما تحتاجه، ولكن يمكنك أيضًا اكتشاف ما إذا كان قد حدث استثناء من داخل التعليمات البرمجية الأصلية لديك.يرى http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 لمزيد من المعلومات.

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