0Pricing
Python Academy · درس

رفع الاستثناءات وإعادة رفعها

استخدم raise للإشارة إلى الأخطاء، وأعد رفعها لمواصلة تمريرها

رفع الاستثناءات وإعادة رفعها درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

تتيح لك الكلمة المفتاحية raise الإبلاغ عن الأخطاء صراحةً. وتحافظ إعادة رفع الاستثناء على سياق الخطأ الأصلي.

رفع استثناء مضمن باستخدام raise

ترفع raise ValueError('message') ذلك النوع من الاستثناءات فورًا مع الرسالة المحددة.
def divide(a, b):
    if b == 0:
        raise ValueError('Denominator cannot be zero')
    return a / b
try:
    divide(5, 0)
except ValueError as e:
    print(e)

إعادة رفع الاستثناء نفسه

تعيد raise داخل except، من دون وسيطة، رفع الاستثناء الحالي مع الحفاظ على التتبّع الأصلي.
def process(data):
    try:
        return int(data)
    except ValueError:
        print('logging error')
        raise  # re-raises original
try:
    process('abc')
except ValueError:
    print('caller caught it')

تسلسل الاستثناءات باستخدام from

يربط raise NewError('msg') from original الاستثناءات في سلسلة. وتُعيَّن القيمة exc.__cause__.
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

منع تسلسل الاستثناءات

تقطع raise NewError() from None السلسلة، إذ تحجب الاستثناء الأصلي في التتبّع.
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

تعليمة assert

ترفع assert condition, 'message' الاستثناء AssertionError إذا كانت قيمة condition هي False. استخدمها للتحققات الثابتة أثناء التطوير فقط.
def sqrt(x):
    assert x >= 0, f'Input must be non-negative, got {x}'
    return x ** 0.5
try:
    sqrt(-1)
except AssertionError as e:
    print(e)

الرفع المشروط

يجعل استخدام عبارات الحراسة مع raise في بداية الدالة الشروط المسبقة واضحة، ويجنبك التداخل العميق.
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

إعادة الرفع مقابل استثناء جديد

تحافظ إعادة الرفع، باستخدام raise مجردة، على السياق. أما الاستثناء الجديد فيخفيه. استخدم التسلسل للإبقاء على كليهما ظاهرًا.
def outer():
    try:
        inner()
    except ValueError as e:
        raise RuntimeError('outer failed') from e
def inner():
    raise ValueError('inner failed')
try:
    outer()
except RuntimeError as e:
    print(e, e.__cause__)

الاستثناء داخل finally

يستبدل رفع استثناء داخل finally الاستثناء الأصلي. تجنب الرفع داخل finally إلا عند الضرورة القصوى.
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn مقابل raise

استخدم warn() للأخطاء البسيطة القابلة للتعافي، واستخدم raise للأخطاء التي يجب التعامل معها. فلكل منهما غرض مختلف.
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

نمط raise from None

عند تغليف استثناءات مكتبة داخل استثناءات API الخاصة بك، استخدم from None لتجنب كشف التفاصيل الداخلية.
class DBError(Exception): pass
def query(q):
    try:
        raise ConnectionError('refused')
    except ConnectionError:
        raise DBError('query failed') from None
try:
    query('SELECT 1')
except DBError as e:
    print(e)

تحقق سريع

ماذا تفعل raise، من دون وسيطة، داخل كتلة except؟

مراجعة

يشير raise Type('msg') إلى وجود أخطاء. وتعُد raise المجردة رفع الاستثناء مرة أخرى. ويربط raise New from Old الاستثناءات في سلسلة. وتحجب raise New from None السياق. استخدم assert للتحققات الثابتة أثناء التطوير.

تابع التقدم

أحسنت! انتقل إلى الدرس التالي لمواصلة تقدمك.

الأسئلة الشائعة

هل درس «رفع الاستثناءات وإعادة رفعها» مجاني؟

نعم — نص درس «رفع الاستثناءات وإعادة رفعها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «رفع الاستثناءات وإعادة رفعها»؟

استخدم raise للإشارة إلى الأخطاء، وأعد رفعها لمواصلة تمريرها تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «رفع الاستثناءات وإعادة رفعها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهم الاستثناءات
  2. try / except / else / finally
  3. رفع الاستثناءات وإعادة رفعها
  4. فئات الاستثناءات المخصصة
← العودة إلى Python Academy