البرمجة

فارق الاستثناءات في Python: raise vs raise e

في لغة البرمجة Python، تعتبر الكلمة الرئيسية “raise” جزءًا من الهيكل التحكمي في الاستثناءات وتستخدم لرفع استثناء. ولكن، هناك فارق هام بين استخدام “raise” بدون تحديد الاستثناء واستخدام “raise e” في بلوك الـ except.

في الدالة a التي تحتوي على “raise” بدون تحديد الاستثناء:

python
def a(): try: raise Exception() except Exception as e: raise

يتم رفع الاستثناء داخل البلوك try، ثم يتم التقاطه في البلوك except، ولكن لا يتم تحديد الاستثناء المحدد عند إعادة رفعه باستخدام “raise” بدون تحديد. يعني ذلك أن الاستثناء الأصلي الذي تم رفعه سيظل محفوظًا، ولا يتم تمريره إلى البلوك الأعلى.

بالنسبة للدالة b التي تحتوي على “raise e”:

python
def b(): try: raise Exception() except Exception as e: raise e

تم رفع الاستثناء داخل البلوك try، ثم تم التقاطه في البلوك except وتخزينه في متغير e، وأخيرًا تم رفعه مرة أخرى باستخدام “raise e”، حيث يتم تمرير الاستثناء الأصلي الذي تم رفعه إلى البلوك الأعلى.

الفرق الرئيسي هو في استخدام “raise e” يتم تمرير الاستثناء المحدد في بلوك الـ except، بينما باستخدام “raise” بدون تحديد يتم الاحتفاظ بالاستثناء الأصلي. يمكن أن يكون هذا ذا أهمية عند التعامل مع سياقات معالجة الأخطاء والاستثناءات في البرمجة حيث قد تحتاج إلى الوصول إلى نوع الاستثناء أو البيانات المرفقة معه.

المزيد من المعلومات

إذاً، لنتعمق أكثر في فهم الاختلاف بين “raise” و”raise e” في بلوك الـ except في Python. عندما نستخدم “raise” بدون تحديد، يتم رفع الاستثناء الذي تم التقاطه في البلوك السابق، ولكن يظل غير معروفٍ بشكل محدد في السياق الحالي. يعني ذلك أنه عندما تقوم برفع الاستثناء باستخدام “raise”، يتم تخزين نوع الاستثناء وبياناته الخاصة في الذاكرة، ولكن لا يتم تمريرها بوضوح إلى البلوك السابق.

من ناحية أخرى، عند استخدام “raise e”، يتم تحديد الاستثناء الذي تم التقاطه في البلوك الـ except بواسطة المتغير e، ثم يتم رفع هذا الاستثناء مرة أخرى باستخدام “raise e”. هذا يعني أن نوع الاستثناء والبيانات المرفقة به تكون متاحة بشكل واضح في البلوك السابق.

من خلال النظر إلى ناتج الأمر dis.dis() الذي تم توفيره في السياق الخاص بك، يظهر الفرق في التعليمات المتاحة لكل دالة. في حالة الدالة a (التي تستخدم “raise”)، تنتهي بشكل مباشر بـ RETURN_VALUE دون أي تفاصيل إضافية عن الاستثناء المرفوع. بينما في حالة الدالة b (التي تستخدم “raise e”)، يظهر استخدام LOAD_FAST للوصول إلى المتغير e ومن ثم RAISE_VARARGS لرفع الاستثناء بشكل واضح.

بالمجمل، يتيح استخدام “raise e” إمكانية الوصول الكامل إلى الاستثناء المحدد، بينما “raise” بدون تحديد يتيح الاحتفاظ بالاستثناء بشكل عام دون تفاصيل إضافية. الاختيار بينهما يعتمد على حاجتك للمعلومات الدقيقة حول الاستثناء في سياق معين.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!