كيفية اكتشاف طريقة سيئة لإعادة تربية استثناء C# باستخدام Stylecop أو VS2010؟

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

  •  26-09-2019
  •  | 
  •  

سؤال

زملائي هم المتسللون C ++ المتمرسين الذين يتحولون إلى .NET. أحد الأخطاء التي يرتكبونها عن غير قصد هو كتابة كود مثل هذا:

catch(ArgumentExcepttion ae)
{
    // Code here logs the exception message
    // And this is supposed to re-throw the exeception
    throw ae; // as opposed to throw;
    // But, as we all know, doing this creates a new exception with a shorter stack trace.
}

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

throw new ArgumentException("text", ae /* inner exc */);

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

catch(Exception e)
{
    Exception newExc = new Exception("text", e);
    Log(newExc);
    throw newExc;
}

أود استخدام أداة مثل Stylecop (التي لدي ، الإصدار 4.3.3.0). أنا أستخدم VS2008 في الوقت الحالي ، لكنني سأتحول إلى VS2010 قريبًا جدًا.

أي أفكار حول كيفية تحقيق ما أبحث عنه؟

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

المحلول

FXCOP لديه قاعدة لهذا: RethrowtopReservestackDetails

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

أعتقد أن تحليل FXCOP مدمج في VS2010 لكنني لست متأكدًا بنسبة 100 ٪ ...

ها هو رابط تنزيل Microsoft لـ FXCOP.

نصائح أخرى

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

أود أن أقترح البحث عن حاصرات الصيد التي تنتهي في رمي ... ؛ بدلا من الانتهاء مع رمي ؛.

على الرغم من أنك تحصل على بعض إيجابية خاطئة ، يمكنك تصفيةها باليد.

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