1. ما هي استثناءات (Exceptions) بايثون؟
استثناءات بايثون هي نوع من الأخطاء التي تحدث أثناء تشغيل البرنامج. عادةً ما ينفّذ البرنامج الأوامر بالتسلسل من الأعلى إلى الأسفل، ولكن إذا حدث خطأ في ظروف معينة، يتوقف تنفيذ ذلك الجزء من الكود ويتم إطلاق استثناء (Exception). على سبيل المثال، محاولة القسمة على صفر تطلق ZeroDivisionError
، ومحاولة الوصول إلى فهرس قائمة غير موجود تطلق IndexError
.
1.1 أنواع الاستثناءات الشائعة
يحتوي بايثون على العديد من الاستثناءات المدمجة (Built-in exceptions). فيما يلي بعض الأمثلة الشائعة:
ValueError
: يحدث عندما تتلقى دالة قيمة غير مناسبة.TypeError
: يحدث عند تنفيذ عملية أو دالة على نوع بيانات غير صالح.IndexError
: يحدث عند محاولة الوصول إلى فهرس خارج نطاق التسلسل (مثل القائمة).ZeroDivisionError
: يحدث عند محاولة القسمة على صفر.
توفر هذه الاستثناءات معلومات تشخيصية مفيدة عند حدوث أخطاء غير متوقعة أثناء تشغيل البرنامج.
2. معالجة الاستثناءات الأساسية باستخدام try
وexcept
في بايثون، نستخدم try
وexcept
لمعالجة الاستثناءات. هذا يمنع البرنامج من التوقف بسبب خطأ، ويسمح لأجزاء أخرى من البرنامج بالاستمرار في العمل حتى في حالة حدوث الخطأ.
2.1 الصيغة الأساسية (Syntax)
ضع الكود الذي يحتمل أن يسبب خطأ داخل كتلة try
، واكتب الكود الذي سيتم تنفيذه في حالة حدوث ذلك الخطأ داخل كتلة except
.
try:
result = 10 / 0
except ZeroDivisionError:
print("ゼロで割ることはできません。")
في هذا المثال، عند حدوث ZeroDivisionError
، سيتم تنفيذ كتلة except
وسيتم طباعة “ゼロで割ることはできません。” (لا يمكن القسمة على صفر).
2.2 استخدام كتل except
متعددة
إذا كنت ترغب في معالجة استثناءات مختلفة متعددة، يمكنك استخدام كتل except
متعددة. على سبيل المثال، يمكنك تنفيذ إجراءات مختلفة لأخطاء مثل NameError
أو TypeError
.
try:
print(a)
except NameError:
print('変数aの値が定義されていません。')
except TypeError:
print('不正な型が使用されました。')
في هذا الكود، بما أن a
غير معرّفة، يحدث NameError
ويتم عرض الرسالة المقابلة.
3. كيفية معالجة استثناءات متعددة معًا
إذا كان من المحتمل أن تحدث أنواع مختلفة من الاستثناءات في البرنامج، يمكنك معالجتها كلها معًا في كتلة except
واحدة.
3.1 معالجة استثناءات متعددة في كتلة except
واحدة
يمكنك تحديد استثناءات متعددة كـ “tuple” (مجموعة) في كتلة except
كما يلي:
try:
num = int(input("数字を入力してください: "))
result = 10 / num
except (ValueError, ZeroDivisionError):
print("無効な入力が行われたか、ゼロで割り算を試みました。")
في هذا المثال، إذا قام المستخدم بإدخال قيمة غير صالحة أو حاول القسمة على صفر، تتم معالجتهما معًا ويتم طباعة “無効な入力が行われたか、ゼロで割り算を試みました。” (تم إدخال مدخل غير صالح، أو تمت محاولة القسمة على صفر).
3.2 معالجة الاستثناءات معًا باستخدام الفئة الأب (Parent Class)
فئة Exception
هي الفئة الأب لمعظم الاستثناءات المدمجة. إذا كنت ترغب في التقاط جميع الاستثناءات، يمكنك استخدام هذه الفئة. ومع ذلك، يجب توخي الحذر عند استخدام هذه الطريقة لأنها شاملة جدًا.
try:
# エラーが発生する可能性のあるコード
except Exception as e:
print("エラーが発生しました:", e)
باستخدام هذه الطريقة، يتم التقاط أي استثناء يحدث ويتم عرض الرسالة. ومع ذلك، يوصى بتصميم الكود لمعالجة استثناءات محددة قدر الإمكان.

4. إطلاق (رفع) الاستثناءات (raise
)
أثناء تشغيل البرنامج، يمكنك إطلاق (رفع) استثناء يدويًا إذا لم يتم استيفاء شروط معينة. للقيام بذلك، استخدم عبارة raise
.
4.1 كيفية استخدام عبارة raise
في المثال التالي، يتم إطلاق ValueError
إذا تم تمرير قيمة سالبة.
def check_value(value):
if value < 0:
raise ValueError("負の値は許可されていません。")
return value
try:
result = check_value(-1)
except ValueError as e:
print(e)
في هذا المثال، بما أن القيمة السالبة -1
يتم تمريرها إلى دالة check_value
، يحدث ValueError
ويتم عرض الرسالة “負の値は許可されていません。” (لا يُسمح بالقيم السالبة).
4.2 تطبيقات raise
يمكن أيضًا استخدام عبارة raise
عند تعريف فئات استثناءات مخصصة (Custom exception classes). من خلال إنشاء استثناءات خاصة بك وإطلاقها في شروط معينة، يمكنك جعل معالجة الأخطاء في البرنامج أكثر مرونة.
5. الحصول على معلومات الاستثناء
عند حدوث استثناء، يمكنك الحصول على معلومات مفصلة عنه لتسهيل عملية تشخيص المشكلة وتصحيح الأخطاء (debugging). يمكنك الحصول على كائن الاستثناء باستخدام عبارة as
في كتلة except
.
5.1 كيفية استخدام عبارة as
في المثال التالي، يتم الحصول على كائن الاستثناء كـ e
ويتم عرض رسالته.
try:
result = 10 / 0
except ZeroDivisionError as e:
print("エラーが発生しました:", e)
في هذا الكود، عند حدوث ZeroDivisionError
، يتم عرض الرسالة “エラーが発生しました: division by zero” (حدث خطأ: القسمة على صفر). يحتوي كائن الاستثناء على معلومات مفصلة مثل نوع الاستثناء ورسالة الخطأ.
5.2 استخدام كائن الاستثناء (Exception Object)
يمكن استخدام كائن الاستثناء ليس فقط لعرض رسائل الخطأ، ولكن أيضًا لتسجيل السجلات (logging) وتنفيذ معالجة إضافية لأخطاء معينة. على سبيل المثال، يمكنك كتابة رسائل الخطأ في ملف سجل للمساعدة في تصحيح الأخطاء لاحقًا.
6. أفضل ممارسات معالجة الاستثناءات
تُحسّن معالجة الاستثناءات الفعالة من متانة وموثوقية البرنامج. فيما يلي بعض أفضل الممارسات في معالجة الاستثناءات في بايثون.
6.1 التقاط استثناءات محددة
حاول التقاط استثناءات محددة قدر الإمكان. بدلاً من التقاط Exception
الشامل، قم بالتقاط الاستثناءات المحددة المتوقعة مثل ValueError
أو TypeError
، مما يجعل معالجة الأخطاء أكثر وضوحًا وهدفًا.
6.2 تسجيل الاستثناءات في السجل (Logging)
يُسهل تسجيل رسائل الخطأ في السجل تحديد سبب المشكلة لاحقًا. خاصة في البرامج والأنظمة الكبيرة، من المهم تسجيل المعلومات عند حدوث استثناء.
6.3 التدهور اللطيف (Graceful Degradation)
من المهم تصميم “التدهور اللطيف” (graceful degradation) بحيث لا يتعطل البرنامج تمامًا حتى عند حدوث استثناء. على سبيل المثال، يمكنك تحسين موثوقية البرنامج عن طريق عرض رسائل خطأ واضحة للمستخدم أو تنفيذ سلوك بديل.
6.4 تجنب معالجة الاستثناءات الزائدة عن الحاجة
تجنب التقاط جميع الاستثناءات وتجاهلها دون القيام بأي شيء. هذا يجعل تصحيح الأخطاء صعبًا وقد يؤدي إلى سلوك غير متوقع للبرنامج. إذا قمت بالتقاط استثناء، تأكد على الأقل من تسجيل رسالة الخطأ أو تنفيذ معالجة مناسبة.
6.5 استخدام كتلة finally
تُستخدم كتلة finally
لكتابة الكود الذي سيتم تنفيذه دائمًا، بغض النظر عما إذا كان هناك استثناء أم لا. على سبيل المثال، يتم كتابة العمليات التي يجب تنفيذها دائمًا هنا، مثل إغلاق الملفات أو تحرير الموارد.
try:
file = open("example.txt", "r")
# ファイルを読み取る処理
except FileNotFoundError:
print("ファイルが見つかりません。")
finally:
file.close()
في هذا المثال، حتى لو فشل فتح الملف، يتم ضمان إغلاق الملف في كتلة finally
.
7. ملخص
تُعد معالجة الاستثناءات في بايثون تقنية مهمة لزيادة موثوقية البرنامج وتمكين الاستجابة المناسبة عند حدوث الأخطاء. من خلال التقاط الأخطاء باستخدام try
وexcept
وإنشاء استثناءات مخصصة باستخدام raise
، يمكنك تحسين مرونة الكود وقابلية صيانته.
- فهمنا ما هي الاستثناءات وتعرفنا على أنواع الاستثناءات الشائعة.
- تعلمنا كيفية إجراء معالجة أساسية للاستثناءات باستخدام
try
وexcept
. - اطلعنا على كيفية معالجة استثناءات متعددة معًا في كتلة
except
واحدة. - تعلمنا كيفية إطلاق الاستثناءات باستخدام عبارة
raise
وتطبيقاتها. - تعلمنا كيفية الحصول على كائن الاستثناء والحصول على معلومات خطأ مفصلة.
- أخيرًا، ناقشنا أفضل ممارسات معالجة الاستثناءات وتطرقنا إلى تصميم معالجة الأخطاء الفعالة.
تُعد معالجة الاستثناءات تقنية أساسية لضمان موثوقية البرنامج. دعونا نستخدم هذه التقنيات لتطوير تطبيقات بايثون قوية وسهلة الاستخدام.