الفرق بين استخدام الرمي والاستثناء في محاولة الصيد

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

سؤال

في بعض الأحيان أرى

try {

} catch(Throwable e) {

}

وأحيانا

try {

} catch(Exception e) {

}

ماهو الفرق

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

المحلول

عن طريق اصطياد Throwable ويشمل أشياء الفئة الفرعية Error. يجب ألا تفعل ذلك عمومًا ، باستثناء ربما في أعلى مستوى "Catch All" من الخيط حيث تريد تسجيل أو التعامل مع كل شيء يمكن أن يحدث بشكل آخر. سيكون أكثر نموذجية في تطبيق نوع الإطار (على سبيل المثال خادم التطبيق أو إطار اختبار) حيث يمكن تشغيل رمز غير معروف ويجب ألا يتأثر بـ اى شى هذا خطأ في هذا الرمز ، قدر الإمكان.

نصائح أخرى

أول واحد يمسك بجميع الفئات الفرعية Throwable (هذا يشمل Exception و Error) ، والثاني يمسك جميع الفئات الفرعية Exception.

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

Throwable فئة سوبر من Exception إلى جانب Error. في الحالات العادية ، يجب أن نلتقط دائمًا فئات فرعية Exception, ، بحيث لا يضيع السبب الجذري.

الحالات الخاصة فقط التي ترى فيها إمكانية حدوث خطأ لا تسيطر على رمز Java الخاص بك ، يجب عليك التقاطها Error أو Throwable.

أتذكر أنني لم يتم تحميل التمسك بأن المكتبة الأصلية لم يتم تحميلها.

Thowable يمسك بكل شيء حتى ThreadDeath الذي يتم إلقاؤه افتراضيًا لإيقاف موضوع من الإهمال الآن Thread.stop() طريقة. لذلك عن طريق اصطياد Throwable يمكنك التأكد من أنك لن تترك كتلة المحاولة أبدًا دون أن تمر على الأقل من خلال كتلة الصيد الخاصة بك ، ولكن يجب أن تكون مستعدًا أيضًا للتعامل معها OutOfMemoryError و InternalError أو StackOverflowError.

اصطياد Throwable يعد مفيدًا للغاية لحلقات الخادم الخارجي التي تفوض جميع أنواع الطلبات إلى التعليمات البرمجية الخارجية ولكن قد لا تنتهي أبدًا للحفاظ على الخدمة حية.

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