الدرس 12 من 20

الدوال والفئات

معالجة الأخطاء

3 دقيقة للقراءة

معالجة الأخطاء القوية أمر حاسم لتطبيقات الذكاء الاصطناعي. واجهات API تفشل، وحدود المعدل تُصطدم، والاستجابات قد تكون مشوهة. تعلم معالجة هذه بشكل أنيق.

أساسيات Try-Except

try:
    result = 10 / 0
except ZeroDivisionError:
    print("لا يمكن القسمة على صفر!")
    result = 0

التقاط استثناءات متعددة

import json

def parse_response(text):
    try:
        data = json.loads(text)
        return data["content"]
    except json.JSONDecodeError:
        print("استجابة JSON غير صالحة")
        return None
    except KeyError:
        print("حقل 'content' مفقود")
        return None

Try-Except-Else-Finally الكامل

def fetch_data(url):
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status()
    except requests.Timeout:
        print("انتهت مهلة الطلب")
        return None
    except requests.HTTPError as e:
        print(f"خطأ HTTP: {e}")
        return None
    else:
        # يُنفذ فقط إذا لم يحدث استثناء
        print("الطلب ناجح!")
        return response.json()
    finally:
        # يُنفذ دائماً (التنظيف)
        print("الطلب اكتمل")

الوصول إلى معلومات الاستثناء

try:
    data = json.loads('{"invalid}')
except json.JSONDecodeError as e:
    print(f"خطأ: {e}")           # رسالة الخطأ الكاملة
    print(f"السطر: {e.lineno}")   # رقم السطر
    print(f"العمود: {e.colno}")   # رقم العمود

رفع الاستثناءات

def validate_temperature(temp):
    if not 0 <= temp <= 2:
        raise ValueError(f"الحرارة يجب أن تكون 0-2، حصلت على {temp}")
    return temp

try:
    validate_temperature(3.0)
except ValueError as e:
    print(e)

الاستثناءات المخصصة

class APIError(Exception):
    """استثناء أساسي لأخطاء API."""
    pass

class RateLimitError(APIError):
    """يُرفع عند تجاوز حد معدل API."""

    def __init__(self, retry_after=60):
        self.retry_after = retry_after
        super().__init__(f"حد المعدل. أعد المحاولة بعد {retry_after} ثانية")

class AuthenticationError(APIError):
    """يُرفع عند فشل مصادقة API."""
    pass

# استخدام الاستثناءات المخصصة
def call_api():
    response_code = 429
    if response_code == 429:
        raise RateLimitError(retry_after=30)
    elif response_code == 401:
        raise AuthenticationError("مفتاح API غير صالح")

try:
    call_api()
except RateLimitError as e:
    print(f"انتظار {e.retry_after} ثانية...")
except AuthenticationError:
    print("تحقق من مفتاح API الخاص بك")

نمط عملي للذكاء الاصطناعي: إعادة المحاولة مع التراجع

import time

def api_call_with_retry(func, max_retries=3):
    """إعادة محاولة استدعاء API مع تراجع أسي."""
    for attempt in range(max_retries):
        try:
            return func()
        except RateLimitError as e:
            if attempt < max_retries - 1:
                wait_time = e.retry_after * (2 ** attempt)
                print(f"حد المعدل. انتظار {wait_time} ثانية...")
                time.sleep(wait_time)
            else:
                raise
        except APIError:
            raise  # لا تُعد المحاولة لأخطاء API الأخرى

# الاستخدام
result = api_call_with_retry(lambda: call_openai_api())

لقد أكملت وحدة الدوال والفئات! بعد ذلك، سنتعلم العمل مع APIs. :::

اختبار

الوحدة 3: الدوال والفئات

خذ الاختبار