الدوال والفئات
معالجة الأخطاء
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. :::