البرمجة بلغة بايثون: معالجة الأخطاء والاستثناءات (try-except)
عند كتابة برامج بلغة بايثون، قد تحدث أخطاء غير متوقعة أثناء التنفيذ تؤدي إلى توقف البرنامج بشكل مفاجئ. تُسمى هذه الأخطاء الاستثناءات (Exceptions). في هذا الدرس، سنتعلم كيفية التعامل معها باستخدام هيكل try-except لضمان استمرارية عمل البرنامج.
1. مفهوم الاستثناءات في بايثون
الاستثناء هو حدث يحدث أثناء تنفيذ البرنامج ويعطل سير العمل الطبيعي. عندما يحدث خطأ، تقوم بايثون بإنشاء كائن استثناء. إذا لم يتم معالجة هذا الاستثناء، سيتوقف البرنامج عن العمل وتظهر رسالة خطأ.
أمثلة على الاستثناءات الشائعة:
ZeroDivisionError: يحدث عند القسمة على صفرValueError: يحدث عند استخدام قيمة غير مناسبةTypeError: يحدث عند إجراء عملية على نوع غير مناسبFileNotFoundError: يحدث عند محاولة فتح ملف غير موجودIndexError: يحدث عند محاولة الوصول إلى فهرس غير موجود في قائمةKeyError: يحدث عند محاولة الوصول إلى مفتاح غير موجود في قاموس
2. هيكل try-except الأساسي
للمعالجة الصحيحة للاستثناءات، نستخدم الكلمتين المفتاحيتين try و except:
try:
# الكود الذي قد يسبب خطأ
الرقم = int(input("أدخل رقماً: "))
النتيجة = 10 / الرقم
print("النتيجة:", النتيجة)
except ZeroDivisionError:
print("خطأ: لا يمكن القسمة على صفر!")
except ValueError:
print("خطأ: يجب إدخال رقم صحيح!")
3. أنواع مختلفة من معالجة الاستثناءات
أ. معالجة استثناءات متعددة: يمكنك التعامل مع أنواع مختلفة من الأخطاء بشكل منفصل:
try:
القائمة = [1, 2, 3]
print(القائمة[5])
except IndexError:
print("خطأ: الفهرس خارج حدود القائمة!")
ب. استخدام except عام: يمكن التقاط أي نوع من الاستثناءات:
try:
س = int(input("أدخل رقماً: "))
print(10 / س)
except Exception as e:
print("حدث خطأ:", e)
4. استخدام else و finally
else: يُنفذ الكود الموجود في else إذا لم يحدث أي استثناء.
finally: يُنفذ دائماً بغض النظر عن حدوث استثناء أم لا. يستخدم عادة لإغلاق الملفات أو تحرير الموارد.
try:
الملف = open("data.txt", "r", encoding="utf-8")
المحتوى = الملف.read()
except FileNotFoundError:
print("الملف غير موجود!")
else:
print("تم قراءة الملف بنجاح")
print(المحتوى)
finally:
# سيتم تنفيذه دائماً
print("انتهت محاولة فتح الملف")
if 'الملف' in locals():
الملف.close()
5. رفع الاستثناءات (raise)
يمكنك رفع استثناء بنفسك باستخدام الكلمة المفتاحية raise:
def تحقق_العمر(العمر):
if العمر < 18:
raise ValueError("يجب أن يكون العمر 18 سنة أو أكثر")
return "مرحباً بك"
try:
print(تحقق_العمر(15))
except ValueError as خطأ:
print("خطأ:", خطأ)
6. مثال تطبيقي شامل
برنامج لقراءة الأعداد من ملف وحساب مجموعها مع معالجة جميع الأخطاء المحتملة:
def حساب_المجموع(اسم_الملف):
المجموع = 0
try:
with open(اسم_الملف, "r", encoding="utf-8") as f:
for سطر in f:
try:
المجموع += float(سطر.strip())
except ValueError:
print(f"تخطي القيمة غير الصالحة: {سطر.strip()}")
except FileNotFoundError:
print(f"الملف {اسم_الملف} غير موجود!")
return None
except Exception as خطأ:
print(f"حدث خطأ غير متوقع: {خطأ}")
return None
else:
print(f"تمت العملية بنجاح. المجموع = {المجموع}")
return المجموع
finally:
print("انتهت محاولة معالجة الملف")
# اختبار الدالة
النتيجة = حساب_المجموع("الأعداد.txt")
if النتيجة:
print(f"النتيجة النهائية: {النتيجة}")
تمارين
تمرين 1: اكتب برنامجاً يطلب من المستخدم إدخال رقمين ويقوم بقسمة الأول على الثاني، مع معالجة خطأ القسمة على صفر وخطأ إدخال قيمة غير رقمية.
تمرين 2: اكتب دالة قراءة_الأعداد() تقرأ قائمة من الأعداد الصحيحة من ملف وتعيد مجموعها، مع معالجة جميع الاستثناءات المحتملة (عدم وجود ملف، قيم غير صالحة).
تمرين 3: أنشئ برنامج تسجيل دخول بسيط يرفع استثناء ValueError إذا كانت كلمة المرور أقل من 8 أحرف.
تمرين 4: اكتب برنامجاً يطلب من المستخدم إدخال 5 أعداد في قائمة ويعالج خطأ IndexError و ValueError.
📍 دروس مشابهة
- الإعلام الآلي -- القوائم في بايثون (مفاهيم أساسية) -- السنة الثانية ثانوي
- الإعلام الآلي -- المتغيرات في بايثون -- السنة الثالثة ثانوي
مدونة التربية و التعليم في الجزائر – دروس، فروض، نتائج امتحانات مدونة التربية والتعليم في الجزائر | تحضير الدروس، فروض واختبارات، نتائج البكالوريا وBEM، مسابقات التوظيف، والتوجيه المدرسي للطلاب وأولياء الأمور.