لماذا لا C# لديها دعم أولا تمرير الاستثناء التصفية ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ملاحظة:هذا ليس نسخة مكررة من جيف السؤال.

أن سؤال "هو ما يعادل?" أنا أعرف ليس هناك و أريد أن أعرف لماذا!

سبب سؤالي هو أن لقد أصبحت واضحة على مدى أهمية و الاستنتاج يبدو غريبا جدا بالنسبة لي.

معالجة الاستثناء كتلة من مايكروسوفت مكتبة المؤسسة ينصحنا أن استخدام هذا النمط:

catch (Exception x)
{
    if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
        throw;

    // recover from x somehow
}

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

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

وفي الوقت نفسه ، CLR فريق في MS يقول هذا ليس خيارا ، اتضح أن هؤلاء الرجال يعرفون ما يتحدثون عنه!المشكلة هي أن الحق قبل catch منع تشغيل أي finally كتل متداخلة داخل try كتلة سيتم تنفيذها.حتى أولئك finally كتل يجوز القيام بأي من الإجراءات التالية:

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

علما بأن using بيان C++/CLI destructors مبنية على try/finally, لذا هم تتأثر أيضا.

لذلك بوضوح catch/throw نمط تصفية الاستثناءات ليست جيدة.ما هو مطلوب فعلا هو وسيلة لتصفية الاستثناءات ، عبر سياسة, في الواقع دون القبض عليهم وذلك مما اثار تنفيذ finally كتل ، ما لم نجد سياسة يخبرنا استثناء آمنة استرداد من.

CLR فريق كتبت عن ذلك مؤخرا:

والنتيجة هي أن علينا أن نكتب وظيفة مساعد في VB.NET أن تسمح لنا بالوصول إلى هذه الحيوية والقدرة من C#.دليل كبير على أن هناك مشكلة هي أن هناك قانون في BCL أن يفعل هذا.الكثير من الناس قد كتبت عن القيام بذلك ، ولكنهم نادرا ما يذكر شيء عن try/finally كتل الذي هو القاتل.

ما أود أن أعرفه هو:

  • هل هناك أي بيانات عامة أو رسائل البريد الإلكتروني مباشرة وقد تلقى الناس من C# فريق في هذا الموضوع ؟
  • هل هناك أي القائمة Microsoft الاتصال اقتراحات يسأل عن هذا ؟ لقد سمعت شائعات منهم ولكن ليس من المحتمل الكلمات بأي شيء.

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

تحديث 2: وجدت قديمة مثيرة للاهتمام بلوق وظيفة من اريك Gunnerson, سابقا C# فريق:

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

كان هذا الافتراض كان حتى كان صحيح شرح لي!

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

المحلول

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

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=401668

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

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

أما بالنسبة جزء من الحصول على رد رسمي من C# الفريق, سوف تحصل على الأرجح أنه عندما كنت إما 1) ملف الاتصال علة أو 2) الحصول على خدع ضد الرئيسي علة.أشك حقا هناك سبب رسمي / التبرير هناك الآن.

هنا هو بلدي المضاربة على هذه المسألة:تخميني هو أن هذه الميزة ببساطة لم يكن على الأصل C# 1.0 مجموعة ميزة و منذ ذلك الوقت لم يكن هناك ما يكفي من الطلب في اللغة.C# و VB فريق تنفق مبلغ لا يصدق من الترتيب في الوقت ميزات اللغة في بداية كل سفينة دورة.علينا أن نجعل بعض جدا من الصعب التخفيضات في بعض الأحيان.دون ما يكفي من الطلب هناك فرصة ضئيلة جدا وهي ميزة تجعل في اللغة.

حتى وقت قريب أراهن أنك سوف يكون من الصعب العثور على 1 من كل 10 أشخاص من فهم الفرق بين VB.Net'ق محاولة/عندما وفقط باستخدام القديمة عادي إذا كان البيان في C# catch.يبدو أن يكون أكثر قليلا على أذهان الشعوب في الآونة الأخيرة حتى ربما أنها سوف تجعل في النسخة المقبلة من الناطقة.

نصائح أخرى

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

من أجل الإجابة الحقيقية على السؤال الخاص بك سوف تحتاج إلى رد من أندرس هيلسبرغ ، أو شخص كان في التصميم الأصلي الاجتماعات.قد حاول معرفة ما إذا كان يمكنك الحصول عليه طلب من قبل قناة 9 المقابلة في المرة القادمة C# تصميم فريق مقابلات.

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

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

إذا لم يكن هناك ربط علة على هذا يجب أن أدخل واحدة و تشجيع الآخرين على التصويت عليه حتى.[أنصح يطلبون الوصول إلى CLR ميزة بدلا من محاولة تصميم مدى تناسبها في اللغة.]

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

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

http://www.chriseargle.com/post/2009/01/Parity-Between-Languages.aspx

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

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

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

توصيتي سيكون وضع اقتراح في ، ومن ثم الترويج لها من أجل الحصول على الآخرين في وزن على ذلك.

وأنا أفهم منهم ، في لحظة rethrow ، وأخيرا معالجات في الداخلية المهام يتم تنفيذها وهذا ما يخلق المشاكل بالنسبة لك.

ولكن دعونا نقول لديك استثناء الفلتر الذي يمر من خلال دون استثناء في الواقع rethrowing ذلك.سوف لا يزال لديك للتعامل معها بطريقة ما في مكان ما ، سيتم تشغيل في نفس النوع من المشاكل (أخيرا الآثار) هناك.

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

أستطيع أن أفكر في اثنين على الأقل من الأسباب باستثناء تصفية غائب من C#

  1. مما يسمح استثناء المرشحات قد تشجع المبرمجين أن تفعل أشياء أثناء مرور الأول-معالجة الاستثناء التي من شأنها أن تكون غير آمنة في ذلك الوقت ، على الرغم من أنها يمكن أن يتم بأمان داخل 'التقاط' أو 'أخيرا'.على سبيل المثال ، إذا كان رمز في "محاولة" كتلة يكتسب قفل يطرح استثناء حين قفل عقد قفل سيعقد خلال تنفيذ الخارجي استثناء المرشحات ، ولكن سيتم الافراج عنهم قبل الخارجي "القبض" أو "أخيرا" كتلة تشغيل.أيضا ، على الأقل في آخر مرة تحققت الاستثناءات التي وقعت في استثناء مرشح وليس اشتعلت داخلها بصمت خنق شيئا من القبيح الوضع.
  2. ومنفذي C# رؤية جعل لغتهم 'إطار الملحد'.إذا كان C# معتمد .صافي أولا تمرير الاستثناء تصفية البرامج التي تستخدم هذه الميزة قد تكون غير صالحة للاستعمال على أطر التعامل مع الاستثناءات بشكل مختلف.هذا هو نفس السبب الذي C# يمنع البرامج من تجاوز `الكائن.وضع الصيغة النهائية()`.في حين أن المنطق المحيطة بها `الكائن.وضع الصيغة النهائية()` معيب (الاستخدام الصحيح destructors يتطلب استخدام منصة أخرى-أساليب محددة ، لذلك تتطلب استخدام المدمر بنية الكائن.وضع الصيغة النهائية()` يحقق شيء إلا t77o على كتابة البرمجيات المعيبة) التعليل لا تجعل بعض الشعور فيما يتعلق استثناء المرشحات.من ناحية أخرى, الطريقة الصحيحة للتعامل مع هذه القضية سيكون لفضح بعض الاستثناء-تصفية الميزات ذات الصلة حتى لو لم تعرض استثناء المرشحات مباشرة.

ميزة واحدة أود حقا أن نرى في C# و vb, التي من شأنها أن تتطلب استخدام استثناء المرشحات لتنفيذ لكن الذي لا يتطلب تعريض لهم مباشرة ، سيكون اختياري Exception المعلمة عن finally كتلة.هذه المعلمة سيكون null إذا لا غير مسك استثناء يحدث ؛ وإلا فإنه عقد الاستثناء في السؤال.هذا من شأنه أن يسمح للحالات التي يكون فيها البرنامج سوف تريد أن تفعل شيئا عندما يحدث استثناء ، ولكن ليس في الواقع "التعامل مع" عليه.في معظم الحالات ، Exception المعلمة لن تستخدم في أي شيء ما عدا أن تحقق null (يعني ميزة يعادل تعريض fault كتل) ، ولكن كان يمكن أن توفر مزايا في حالة حدوث استثناء أثناء التنظيف.في الوقت الحاضر, في حالة حدوث استثناء أثناء finally كتلة من الضروري إما خنق finally-كتلة استثناء أو الكتابة الموجودة من قبل أحد.وبعد وقت سابق استثناء المتاحة finally كتلة التعليمات البرمجية يمكنها أن أي التفاف أو تسجيل ذلك.

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