سؤال

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

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

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

المحلول

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

فحص استثناءات ينبغي أن تستخدم يمكن التنبؤ بها, ولكن منعها أخطاء معقول للتعافي من.

دون رادع استثناءات ينبغي أن تستخدم في كل شيء آخر.

سأكسر هذا بالنسبة لك ، لأن معظم الناس يسيئون فهم ما يعنيه هذا.

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

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

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

لكل فحص لحالها الاستثناءات ، استخدام الحق في مستوى التجريد.على سبيل المثال ، مدونة مستودع مع اثنين من تطبيقات مختلفة (قاعدة البيانات و الملفات) يجب تجنب تعريض تنفيذ تفاصيل محددة عن طريق رمي SQLException أو IOException.بل ينبغي أن التفاف الاستثناء في التجريد التي تغطي جميع التطبيقات (على سبيل المثال RepositoryException).

نصائح أخرى

من جافا المتعلم:

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

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

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

حكم استخدام هو:أبدا استخدام لحالها استثناءات!(أو عندما لا ترى أي حل)

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

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

مع التحقق من الاستثناءات الخاصة بك معالجة الخطأ stategy هو micro-إدارة لا يطاق على أي نظام كبير.

معظم الوقت كنت لا أعرف إذا كان خطأ "استردادها" لأنك لا تعرف في ماذا طبقة المتصل من API يقع.

دعنا نقول أن أقوم بإنشاء StringToInt API الذي يحول تمثيل سلسلة من عدد صحيح على عدد صحيح.يجب رمي فحص استثناء إذا كان يتم استدعاء API مع "فو" السلسلة ؟ هو للاسترداد ?أنا لا أعرف لأنه في طبقة المتصل من StringToInt API قد سبق التحقق من صحة المدخلات ، وإذا كان هذا طرح استثناء إما خلل أو تلف البيانات و لا يمكن استردادها عن هذه الطبقة.

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

ما هو للاسترداد يعتمد معظم الوقت على المتصل من API ، وليس على writter API.API يجب عدم استخدام فحص الاستثناءات فقط دون رادع استثناءات تسمح أن تختار إما القبض أو تجاهل استثناء.

كنت الصحيح.

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

على سبيل المثال:

/**
 * @params operation - The operation to execute.
 * @throws IllegalArgumentException if the operation is "exit"
 */
 public final void execute( String operation ) {
     if( "exit".equals(operation)){
          throw new IllegalArgumentException("I told you not to...");
     }
     this.operation = operation; 
     .....  
 }
 private void secretCode(){
      // we perform the operation.
      // at this point the opreation was validated already.
      // so we don't worry that operation is "exit"
      .....  
 }

فقط لوضع سبيل المثال.وهذه النقطة هي, إذا فشل نظام سريع ، ثم عليك أن تعرف أين و لماذا لم تفشل.ستحصل على stacktrace مثل:

 IllegalArgumentException: I told you not to use "exit" 
 at some.package.AClass.execute(Aclass.java:5)
 at otherPackage.Otherlass.delegateTheWork(OtherClass.java:4569)
 ar ......

وعليك أن تعرف ما حدث.على OtherClass في "delegateTheWork" الطريقة ( في خط 4569 ) تسمى الفئة الخاصة بك مع "خروج" قيمة, حتى عندما لا ينبغي الخ.

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

نفس الشيء يحدث مع NullPointerExceptions.إذا كان لديك 700 خطوط الدرجة مع بعض 15 الأساليب التي تستخدم 30 سمات أيا منها لا يمكن أن تكون فارغة بدلا من التحقق في كل من هذه الأساليب nullability يمكن أن تجعل جميع تلك سمات للقراءة فقط " و " التحقق من صحة لهم في منشئ أو طريقة مصنع.

 public static MyClass createInstane( Object data1, Object data2 /* etc */ ){ 
      if( data1 == null ){ throw NullPointerException( "data1 cannot be null"); }

  }


  // the rest of the methods don't validate data1 anymore.
  public void method1(){ // don't worry, nothing is null 
      ....
  }
  public void method2(){ // don't worry, nothing is null 
      ....
  }
  public void method3(){ // don't worry, nothing is null 
      ....
  }

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

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

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

إذا كنت الإفراط لحالها استثناء شيء من هذا القبيل سيحدث.المستخدمين من أن التعليمات البرمجية لا أعرف إذا كان هناك شيء قد تسوء الكثير من محاولة{...}catch( Throwable t ) سوف تظهر.

هنا هو بلدي 'النهائي القاعدة'.
يمكنني استخدام:

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

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


لكل من تلك الاستثناءات ، أنا خلق بلدي لحالها و فحص استثناء طلبي (ممارسة جيدة ، كما satellite هنا) ، باستثناء شائع جدا لحالها استثناء (مثل NullPointerException)

لذا فعلى سبيل المثال ، فإن الهدف من هذه وظيفة معينة أدناه هو جعل (أو إذا كان موجودا بالفعل) كائن ،
المعنى:

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

على سبيل المثال:


/**
 * Build a folder. <br />
 * Folder located under a Parent Folder (either RootFolder or an existing Folder)
 * @param aFolderName name of folder
 * @param aPVob project vob containing folder (MUST NOT BE NULL)
 * @param aParent parent folder containing folder 
 *        (MUST NOT BE NULL, MUST BE IN THE SAME PVOB than aPvob)
 * @param aComment comment for folder (MUST NOT BE NULL)
 * @return a new folder or an existing one
 * @throws CCException if any problems occurs during folder creation
 * @throws AssertionFailedException if aParent is not in the same PVob
 * @throws NullPointerException if aPVob or aParent or aComment is null
 */
static public Folder makeOrGetFolder(final String aFoldername, final Folder aParent,
    final IPVob aPVob, final Comment aComment) throws CCException {
    Folder aFolderRes = null;
    if (aPVob.equals(aParent.getPVob() == false) { 
       // UNCHECKED EXCEPTION because the caller failed to live up
       // to the documented entry criteria for this function
       Assert.isLegal(false, "parent Folder must be in the same PVob than " + aPVob); }

    final String ctcmd = "mkfolder " + aComment.getCommentOption() + 
        " -in " + getPNameFromRepoObject(aParent) + " " + aPVob.getFullName(aFolderName);

    final Status st = getCleartool().executeCmd(ctcmd);

    if (st.status || StringUtils.strictContains(st.message,"already exists.")) {
        aFolderRes = Folder.getFolder(aFolderName, aPVob);
    }
    else {
        // CHECKED EXCEPTION because the callee failed to respect his contract
        throw new CCException.Error("Unable to make/get folder '" + aFolderName + "'");
    }
    return aFolderRes;
}

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

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

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

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

هنا حل بسيط جدا إلى فحص/لحالها المعضلة.

المادة 1:أعتقد من دون رادع استثناء باعتبارها قابلة للاختبار الشرط قبل التعليمات البرمجية.على سبيل المثال...

x.doSomething(); // the code throws a NullPointerException

حيث x هو باطل......رمز يجب ان يكون التالي...

if (x==null)
{
    //do something below to make sure when x.doSomething() is executed, it won’t throw a NullPointerException.
    x = new X();
}
x.doSomething();

المادة 2:أعتقد من فحص استثناء مثل الأمم المتحدة-قابلة للاختبار الحالة التي قد تحدث أثناء تنفيذ التعليمات البرمجية.

Socket s = new Socket(“google.com”, 80);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();

في المثال أعلاه, URL (google.com) قد تكون غير متوفرة بسبب ملقم DNS يجري أسفل.حتى في لحظة ملقم DNS يعمل و حل 'google.com' اسم إلى عنوان IP, إذا كان الاتصال إلى google.com في أي وقت خاتمة الشبكة يمكن أن تذهب إلى أسفل.كنت ببساطة لا يمكن اختبار الشبكة في كل وقت قبل القراءة والكتابة إلى تيارات.

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

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

هناك منطقة رمادية إلى هذا.في حال أن العديد من الفحوصات اللازمة (العقل تهب إذا كان البيان مع الكثير من && و||) الاستثناء القيت سيكون CheckedException ببساطة لأن الكثير من الألم للحصول على حق — كنت ببساطة لا يمكن أن نقول هذه مشكلة خطأ في البرمجة.إذا كان هناك أقل من 10 اختبارات (مثلا ، 'if (x == null)'), ثم مبرمج الخطأ ينبغي أن يكون UncheckedException.

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

2 القواعد أعلاه من المحتمل إزالة 90% من القلق الذي للاختيار من بينها.تلخيص قواعد تتبع هذا النمط... 1) إذا كان رمز إلى أن تنفيذ يمكن اختبارها قبل تنفيذها من أجل أن تعمل بشكل صحيح في حالة حدوث استثناء — أ.ك.أ.مبرمج الخطأ الاستثناء ينبغي أن يكون UncheckedException (فئة فرعية من RuntimeException).2) إذا كان رمز ليتم تنفيذها لا يمكن أن يكون اختبار قبل أن يتم تنفيذها من أجل أن تعمل بشكل صحيح ، فإن الاستثناء ينبغي أن يكون فحص استثناء (فئة فرعية من استثناء).

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

فحص استثناء: إذا كان العميل يمكن استرداد من استثناء ترغب في الاستمرار في استخدام فحص استثناء.

دون رادع استثناء: إذا كان العميل لا يمكن أن تفعل أي شيء بعد استثناء ثم رفع لحالها استثناء.

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

الرجوع هنا

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

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

هنا أريد أن أشارك رأيي أنا بعد سنوات عديدة من الخبرة في مجال التنمية:

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

  2. دون رادع استثناء.هذا هو جزء من البرمجة استثناء بعض الخطأ في البرنامج كود البرمجة (خلل أو عيب) و يعكس طريقة المبرمجين يجب استخدام API كما في الوثائق.إذا كان خارجي lib/الإطار يقول الطبيب انها تتوقع الحصول على البيانات في بعض مجموعة غير فارغة, لأن NPE أو IllegalArgumentException سيتم طرح, مبرمج يجب أن نتوقع ذلك استخدام API بشكل صحيح كما في الوثائق.وإلا فإن الاستثناء سيتم طرح.وعادة ما يطلق عليه قبل المعالجة استثناء أو "التحقق من صحة" استثناء.

من قبل الجمهور المستهدف.الآن دعونا نتحدث عن الجمهور المستهدف أو مجموعة من الناس الاستثناءات وقد تم تصميم (حسب رأيي):

  1. فحص استثناء.الجمهور المستهدف من المستخدمين/العملاء.
  2. دون رادع استثناء.الجمهور المستهدف هو المطورين.قبل غيرها من الكلمات لحالها استثناء مصممة للمطورين فقط.

قبل تطبيق دورة حياة تطوير المرحلة.

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

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

فحص الاستثناءات هي مفيدة قابلة للاسترداد الحالات حيث كنت ترغب في تقديم معلومات إلى المتصل (أيأذونات غير كافية, لم يتم العثور على الملف ، إلخ).

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

Whnever استثناء هو أقل احتمالا متوقعا ، و يمكننا المضي قدما حتى بعد اصطياد هذا ونحن لا يمكن أن تفعل أي شيء لتجنب ذلك الاستثناء ثم يمكننا استخدام فحص استثناء.

كلما كنا نريد أن نفعل شيئا ذا معنى عندما معين الاستثناءات يحدث عندما يكون ذلك استثناء من المتوقع لكن ليس من المؤكد بعد فحص استثناء.

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

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

المزيد من الاستثناءات العامة يمكن أن يتم دون رادع ، أقل من عام يتم التحقق.

أعتقد أننا يمكن أن نفكر exeptions من عدة أسئلة:

لماذا exeption يحدث ؟ ماذا يمكننا أن نفعل عندما يحدث

عن طريق الخطأ ، علة. مثل طريقة null كائن يسمى.

String name = null;
... // some logics
System.out.print(name.length()); // name is still null here

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

من خلال مدخلات من الخارجية ، لا يمكنك التحكم أو الثقة الإخراج من الخدمة الخارجية.

String name = ExternalService.getName(); // return null
System.out.print(name.length());    // name is null here

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

قبل وقت استثناء من الخارجية ، لا يمكنك التحكم أو الثقة الخدمة الخارجية.

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

من خلال فحص استثناء من الخارجية ، لا يمكنك التحكم أو الثقة الخدمة الخارجية.

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

في هذه الحالة, هل نحن بحاجة إلى أن تعرف ما هو نوع من الاستثناء حدث في ExternalService? ذلك يعتمد:

  1. إذا كان يمكنك التعامل مع بعض أنواع الاستثناءات تحتاج إلى إلقاء القبض عليهم و العملية.للآخرين, فقاعة لهم.

  2. إذا كنت بحاجة إلى تسجيل أو استجابة المستخدم المحددة execption ، يمكنك القبض عليهم.للآخرين, فقاعة لهم.

علينا أن نميز بين هذين النوعين من الاستثناء بناء على ما إذا كان هو مبرمج خطأ أم لا.

  • إذا كان خطأ هو مبرمج خطأ ، يجب أن تكون لحالها استثناء. على سبيل المثال:SQLException/IOException/NullPointerException.هذه الاستثناءات هي أخطاء البرمجة.ينبغي التعامل معها من قبل المبرمج.بينما في JDBC API ، SQLException يتم فحص الاستثناء في الربيع JDBCTemplate وهو لحالها استثناء.مبرمج لا تقلق SqlException ، عند استخدام الربيع.
  • إذا حدث خطأ غير مبرمج خطأ والسبب هو قادم من الخارجية ، يجب أن يكون فحص استثناء. على سبيل المثال:إذا كان حذف الملف أو الملف يتم تغيير الإذن من قبل شخص آخر ، ينبغي استردادها.

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

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

في حالة وضع الطبقات نظام المؤسسة ، عليك أن تختار في الغالب دون رادع استثناء لرمي, ولكن لا تنسى أن استخدام فحص الاستثناء في حالة لا يمكنك أن تفعل أي شيء.

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

حكم استخدام هو:أبدا استخدام لحالها استثناءات!(أو عندما لا ترى أي حل)

من وجهة نظر المطور باستخدام المكتبة الخاصة بك أو المستخدم النهائي باستخدام library/application انه من المؤسف حقا أن تكون في مواجهة مع أحد التطبيقات التي تعطل بسبب uncought استثناء.و أعتمد على التقاط كل ما هو ليس جيدا أيضا.

هذه الطريقة للمستخدم النهائي لا يزال يمكن أن يكون تقديمك مع رسالة خطأ بدلا من تطبيق وتختفي تماما.

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