سؤال

لحظر مثل هذا:

try:
    #some stuff
except Exception:
    pass

بيلينت يثير تحذير W0703 "الصيد" استثناء ". لماذا ا؟

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

المحلول

تعتبر ممارسات جيدة لعدم امتلاك كائن استثناء الجذر عادة، ولكن بدلا من ذلك للقبض على المزيد من العناصر المحددة - على سبيل المثال IOException.

فكر في ما إذا حدث استثناء من الذاكرة - ببساطة باستخدام "Pass" لن يغادر برنامجك في حالة جيدة.

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

نصائح أخرى

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

بعد أن قال ذلك، نظرا لأن Python2.6، أصبح الاستيفاء أكثر معقولة بكثير، لأن جميع الاستثناءات التي لا تريد التقاطها (SystemExit، KeyboBoardintrupt) لم تعد ميراث من الاستثناء. ويرثون بدلا من ذلك من baseException مشترك بدلا من ذلك. وقد تم ذلك عمدا من أجل جعل استثناء استثناء غير ضار نسبيا، لأنه مثل هذا المصطلح المشترك.

يرى بيب 3110. للحصول على التفاصيل والخطط المستقبلية.

لأنه يعتقد أنك تصطاد كثيرا. وهذا صحيح.

يتم رفع الاستثناء عند شيء ... يحدث استثنائي. من الجيد بشكل عام أن ينتهي البرنامج.

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

مثل إجابة جريج، "استثناء" هو فئة أساسية وينبغي أن تستمد الاستثناءات من هذه الفئة، انظر أيضا exceptions.exception..

هنا مفيدة جدا قائمة الأخطاء في pydocs.

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

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 

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

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

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