[java] لماذا لا يتم التحقق من الاستثناءات في .NET؟



Answers

في المقالة "المشكلة مع استثناءات تم التحقق منها" وفي صوت Anders Hejlsberg (مصمم لغة C #) ، هناك ثلاثة أسباب رئيسية لـ C # لا تدعم استثناءات محددة عند العثور عليها والتحقق منها في Java:

  • محايد على الاستثناءات التي تم فحصها

    "C # صامت بشكل أساسي على مسألة الاستثناءات المحددة. وبمجرد معرفة حل أفضل - وثق بي أننا ما زلنا نفكر في الأمر - يمكننا العودة إلى وضع شيء ما بالفعل في مكانه.

  • الإصدار مع استثناءات محددة

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

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

  • قابلية الاستثناءات التي تم فحصها

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

في مقاله ، " لماذا لا تملك C # مواصفات استثناء؟ "، كما يسرد Anson Horton (مدير برنامج Visual C #) الأسباب التالية (راجع المقالة للحصول على تفاصيل حول كل نقطة):

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

من المثير للاهتمام أن نلاحظ أن C # ، مع ذلك ، تدعم وثائق الاستثناءات التي يتم طرحها بواسطة طريقة معينة عبر العلامة <exception> والمحول حتى تأخذ مشكلة التحقق من وجود نوع الاستثناء المشار إليه بالفعل. ومع ذلك ، لا يوجد فحص يتم إجراؤه في مواقع الاتصال أو استخدام الطريقة.

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

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

وأخيرًا ، لدى بروس إيكيل ، مؤلف كتاب Thinking in Java ، مقالة بعنوان " هل تحتاج Java إلى استثناءات محددة؟ "، قد يكون من المفيد قراءتها أيضًا لأن السؤال عن سبب عدم وجود استثناءات غير موجودة في C # عادة ما يتجذر في المقارنات مع Java.

Question

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




ذهبت من جافا إلى C # بسبب تغيير الوظيفة. في البداية ، كنت قلقاً قليلاً بشأن الفرق ، لكن من الناحية العملية ، لم يحدث أي فرق.

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

في وقت لاحق نشر لا يؤدي الإعلان عن رمي في جاوة لي حقا أي شيء.

أود الحصول على طريقة للقول بأن وظيفة ما لا تلقي أبداً بالتأكيد - أعتقد أن ذلك سيكون أكثر فائدة.




أنا في بعض الأحيان تفوت التحقق من الاستثناءات في C # /. NET.

أفترض إلى جانب جافا لا يوجد منها منصة أخرى ملحوظة لها. ربما ذهب الرجال. NET مع تدفق ...




وبحلول الوقت الذي تم فيه تصميم .NET ، قامت Java بفحص بعض الاستثناءات لبعض الوقت ، وتم عرض هذه الميزة بواسطة مطوري Java في أفضل الأحوال controversial controversial . وهكذا اختار المصممين دوت نت عدم تضمينه بلغة C #.




ومن المثير للاهتمام ، أن الأشخاص في Microsoft Research أضافوا استثناءات محددة إلى Spec# ، المجموعة الفائقة لـ C #.




Links