معالجة الأخطاء في Python باستخدام try, except, finally
يُعد التعامل مع الأخطاء جزءًا أساسيًا من تطوير برامج عالية الجودة وموثوقة. حتى أكثر المطورين خبرة ليسوا بمأمن من ظهور الأخطاء أثناء تشغيل البرنامج. لتجنب انهيار التطبيق بالكامل في مثل هذه المواقف، توفر Python أدوات قوية لمعالجة الاستثناءات.
في هذا الدليل، سنستعرض الاستخدام الصحيح لبنى try و except و finally لإنشاء كود مقاوم للأخطاء.
أساسيات معالجة الاستثناءات في Python
ما هي معالجة الأخطاء
تتيح لك معالجة الأخطاء في Python اعتراض الاستثناءات التي تحدث أثناء تشغيل البرنامج. بدلاً من إنهاء التطبيق بشكل مفاجئ، يقوم النظام بتنفيذ إجراءات محددة للتعامل مع الموقف الإشكالي بشكل صحيح.
العناصر الأساسية لنظام معالجة الاستثناءات
يعتمد نظام معالجة الأخطاء في Python على ثلاث كتل رئيسية:
- try — كتلة الكود التي قد يحدث فيها استثناء
- except — كتلة لمعالجة نوع معين من الأخطاء
- finally — كتلة كود يتم تنفيذها بغض النظر عن النتيجة
البنية الأساسية لـ try-except-finally
صيغة البنية الأساسية
try:
# كود قد يسبب استثناء
pass
except SpecificError:
# كود لمعالجة خطأ معين
pass
finally:
# كود يتم تنفيذه في جميع الحالات
pass
تطبيق عملي للبنية الأساسية
try:
user_input = input("أدخل رقمًا: ")
number = int(user_input)
print(f"لقد أدخلت الرقم: {number}")
except ValueError:
print("خطأ: يجب إدخال رقم صحيح")
finally:
print("تمت العملية")
في حالة الإدخال الصحيح، سيعرض البرنامج الرقم الذي أدخلته. أما في حالة الإدخال غير الصحيح، فسيتم عرض رسالة خطأ. سيتم تنفيذ كتلة finally في جميع السيناريوهات.
معالجة أنواع مختلفة من الاستثناءات
معالجة أخطاء متعددة
تسمح Python بمعالجة أنواع مختلفة من الاستثناءات باستخدام عدة كتل except:
try:
dividend = 10
divisor = 0
result = dividend / divisor
except ZeroDivisionError:
print("عملية القسمة على صفر غير مسموح بها")
except ValueError:
print("تم اكتشاف تنسيق بيانات غير صحيح")
except TypeError:
print("أنواع بيانات غير متوافقة للعملية")
finally:
print("تم الانتهاء من معالجة العملية الحسابية")
معالجة الأخطاء بدون كتلة finally
كتلة finally ليست مكونًا إلزاميًا. في حالة غيابها، يعالج البرنامج الاستثناء ويواصل التنفيذ:
try:
data_list = [1, 2, 3, 4, 5]
element = data_list[10] # محاولة الوصول إلى فهرس غير موجود
except IndexError:
print("محاولة الوصول إلى فهرس خارج نطاق القائمة")
الحصول على معلومات تفصيلية عن الاستثناءات
استخدام الكلمة المفتاحية as
للحصول على معلومات مفصلة عن الاستثناء، يتم استخدام البنية مع الكلمة المفتاحية as:
try:
calculation = 15 / 0
except ZeroDivisionError as error:
print(f"تم اكتشاف خطأ: {error}")
print(f"نوع الخطأ: {type(error).__name__}")
النتيجة:
تم اكتشاف خطأ: division by zero
نوع الخطأ: ZeroDivisionError
معالجة شاملة لجميع الاستثناءات
في بعض الحالات، قد تحتاج إلى اعتراض أي استثناء محتمل:
try:
potentially_risky_operation()
except Exception as error:
print(f"حدث خطأ غير متوقع: {error}")