سؤال

ما هو المكان المناسب لشرح معالجة الخطأ في محاولة اللحاق البيان ؟ يبدو أنك يمكن وضع التعليقات التوضيحية إما في بداية محاولة منع أو كتلة catch.

// Possible comment location 1
try
{   
    // real code
}
// Possible comment location 2
catch
{
    // Possible comment location 3

    // Error handling code

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

المحلول

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

try
{   
    real code // throws SomeException
    real code // throws SomeOtherException
}
catch(SomeException se)
{
    // explain your error handling choice if it's not obvious
}
catch(SomeOtherException soe)
{
    // explain your error handling choice if it's not obvious
}

نصائح أخرى

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

أنا لا أعتقد أنه يهم على الإطلاق.

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

وماذا عن مجرد إنشاء التعليمات البرمجية بحيث أنها لا تحتاج إلى تعليق اضافية؟

try
{ 
   performDifficultAct( parameter );
}
catch (ArgumentOutOfRangeException couldNotFindArgument)
{
   // handle exception
}
catch (Exception otherUnknownException )
{
   // handle exception
}

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

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

public void PerformSomeActionOrOther(string parameter)
{
  try
  { 
     // For some reason an eleven character string causes a bluescreen from Kernel32
     if (parameter.Length==11) parameter+=" ";

     performDifficultAct( parameter );
  }
  catch (ArgumentOutOfRangeException couldNotFindArgument)
  {
     this.Log.WriteLn("Argument out of range exception in ArbitraryClass.PerformSomeActionOrOther");
     this.Log.WriteLn(String.Format("Probable cause is that {0} is not in the array", parameter));
     this.Log.WriteLn(String.Format("Exception: {0}", couldNotFindArgument.Message));
  }
  catch (Exception otherUnknownException )
  {
     this.Log.WriteLn("Unexpected exception in ArbitraryClass.PerformSomeActionOrOther");
     this.Log.WriteLn(String.Format("Exception: {0}", otherUnknownException.Message));
     throw( otherUnknownException );
  }
}

بالتأكيد لا تعليق أعلى من ذلك لأن ما يمكنك من المفيد أن أقول إلا "ابتداء استثناء التعامل مع كتلة هنا" ؟ التعليقات على التقاط البيانات بشكل أفضل ، ولكن في عام ، مرة أخرى ، ماذا ستقول ؟ "التعامل مع NullPointerException"?

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

أعتقد مكتوبة بشكل جيد حاول/catch يجب أن تكون موجزة محددة.أنا أتفق مع @جيسون أن لماذا هو أكثر أهمية ولكن على قدم المساواة ، من المهم أن تبقى التعليمات البرمجية داخل قبض مختصرة قدر الإمكان.

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

والموقع لا يهم طالما كنت ثابتا. بلدي تفضيل شخصي كما يلي:

//comment 1: code does XYZ, can cause exceptions A, B, C
try {
    //do something
}
//comment 2: exception A occurs when foo != bar
catch (ExceptionA a) {
    //do something
}
//comment 3: exception B occurs when bar is null
catch (ExceptionB b) {
    //do something
}
//comment 4: exception B occurs when foo is null
catch (ExceptionC c) {
    //do something
}

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

عادة التعليقات تميل إلى أن الوثيقة إما:

  • رمز هذا الاتفاق.الأشياء التي تبدو مثل هذا: ++i?--g:h-i;
  • طويلة كتل من التعليمات البرمجية التي تحتاج إلى تلخيص
  • رمز إما أن يكون المتاح أو ليس له سبب واضح الحالية

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

bool retries = 0;
while (retries < MAX_RETRIES)
{
    try
    {
        ... database access code
        break;
    }
    // If under max retries, log and increment, otherwise rethrow
    catch (SqlException e)
    {
        logger.LogWarning(e);
        if (++retries >= MAX_RETRIES)
        {
            throw new MaxRetriesException(MAX_RETRIES, e);
        }
    }
    // Can't retry.  Log error and rethrow.
    catch (ApplicationException e)
    {
        logger.LogError(e);
        throw;
    }
}

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

bool retries = 0;
while (canRetry(retries))
{
    try
    {
        ... database access code
        break;
    }
    catch (SqlException e)
    {
        logger.LogWarning(e);
        retries = incrementRetriesOrThrowIfMaxReached(retries, e);
    }
    catch (ApplicationException e)
    {
        logger.LogError(e);
        throw;
    }
}

...

private void incrementRetriesOrThrowIfMaxReached(int retries, Exception e)
{
    if (++retries >= MAX_RETRIES)
        throw new MaxRetriesException(MAX_RETRIES, e);

    return retries;
}

private bool canRetry(int retries)
{
    return retries < MAX_RETRIES;
}

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

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