English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دروس بايثون الأساسية

تحكم في العملية في بايثون

الوظائف في بايثون

أنواع البيانات في بايثون

عمليات ملفات بايثون

الرموز والفئات في بايثون

التاريخ والوقت في بايثون

معرفة متقدمة في بايثون

دليل بايثون

معالجة الاستثناءات في بايثون - Try، Except و finally

في هذا المقال، ستتعرف على كيفية استخدام جمل try، except و finally لمعالجة الاستثناءات في برامج بايثون. هذا سيشجعك على كتابة كود نظيف ومرئي وفعال باستخدام بايثون.

ما هو الاستثنائي في بايثون?

لدي بايثون العديدالاستثناءات المدمجة  ، عندما تحدث بعض الأخطاء، فإنها تجبر برنامجك على إطلاق رسالة خطأ.

عند حدوث هذه الاستثناءات، فإنها ستؤدي إلى توقف العملية الحالية وإيصالها إلى عملية النداء، حتى يتم معالجتها. إذا لم يتم معالجتها، فإن برنامجنا سيتم تدميره.

على سبيل المثال، إذا قام الدالة A بتشغيل الدالة B، والذي بدوره يقوم بتشغيل الدالة C، وحدث استثنائي في الدالة C. إذا لم يتم معالجة الاستثنائي في C، فإن الاستثنائي سيتم نقلها إلى B، ثم إلى A.

إذا لم يتم معالجة ذلك، سيتم إطلاق رسالة خطأ، وسيتوقف برنامجنا بشكل مفاجئ.

التقاطع الاستثنائي في بايثون

يمكن استخدام جملة try في بايثون لمعالجة الاستثناءات.

العمليات التي قد تؤدي إلى استثناءات يجب وضعها في جملة try، و كتابة كود معالجة الاستثناء في جملة except.

بعد التقاطع الاستثنائي، ما سنقوم به يعتمد علينا. هذا مثال بسيط.

# استيراد مكتبة sys للحصول على نوع الاستثنائية
import sys
randomList = ['a', 0, 2]
for entry in randomList:
    try:
        print("الإدخال هو", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!", sys.exc_info()[0], "حدث.")
        print("الإدخال التالي.")
        print()
print("عكوس", entry, "هو", r)

النتائج الصادرة

الإدخال هو a
Oops! <class 'ValueError'> حدث.
الإدخال التالي.
الإدخال هو 0
Oops! <class 'ZeroDivisionError'> حدث.
الإدخال التالي.
الإدخال هو 2
عكوس 2 هو 0.5

في هذا البرنامج، يتم تنفيذ الدورات حتى يتم إدخال عدد صحيح يحتوي على عكس معكوس صحيح. يتم وضع الجزء الذي قد يسبب استثنائية داخل بلاك try.

إذا لم يحدث أي استثنائية، فإنه يتم تجاوز محتويات البلاك ويستمر في عملية العادة. ولكن إذا حدث أي استثنائية، فإنها يتم التقاطعها من قبل بلاك except.

في هذا المثال، نستخدم وظيفة exinfo() من مكتبة sys لطباعة اسم الاستثنائية، ونطلب من المستخدم محاولة مرة أخرى. يمكننا رؤية أن القيم 'a' و '1.3' تسببان استثنائية ValueError، و '0' تسبب استثنائية ZeroDivisionError.

التقاطع الاستثنائيات المحددة في Python

في هذا المثال، لم يتم ذكر أي استثنائية في جملة except.

ليس هذا عادةً عادةً ممارسة برمجة جيدة، لأنه سيقوم بحجز جميع الاستثنائيات ويقوم بمعالجتها بنفس الطريقة. يمكننا تحديد الاستثنائيات التي سيقوم جملة except بحجزها.

يمكن لجملة try أن تحتوي على أي عدد من جمل except لتعاملها بطريقة مختلفة، ولكن يتم تنفيذ جملة except واحدة فقط عند حدوث استثنائية.

يمكننا استخدام مجموعة القيم في جملة except لتعيين استثنائات متعددة. هنا مثال بديل.

try:
   # تنفيذ بعض الأوامر
   pass
except ValueError:
   # معالجة استثنائية ValueError
   pass
except (TypeError, ZeroDivisionError):
   # معالجة استثنائات متعددة
   # TypeError و ZeroDivisionError استثنائات
   pass
except:
   # معالجة جميع الاستثناءات الأخرى
   pass

إطلاق الاستثناء

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

يمكننا أيضًا اختيار نقل القيمة إلى الاستثناء لتوضيح السبب في إطلاق الاستثناء.

>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument
>>> try:
...        a = int(input("أدخل عدد صحيح إيجابي: "))
...        if a <= 0:
...        raise ValueError("هذا ليس عدد صحيح!")
...    except ValueError as ve:
...    print(ve)
...    
أدخل عدد صحيح إيجابي: -2
هذا ليس عدد صحيح!

try...finally

يمكن أن يكون جملة try في بايثون لها جملة finally اختيارية. سيتم تنفيذ هذه الجملة في جميع الحالات، وعادة ما تستخدم لتحرير الموارد الخارجية.

على سبيل المثال، يمكننا الاتصال عبر الشبكة بمراكز البيانات البعيدة أو استخدام ملف أو واجهة مستخدم رسومية (GUI).

في جميع هذه الحالات، يجب علينا إزالة الموارد مهما كان النجاح أو الفشل، هذه العمليات (إغلاق الملف، واجهة المستخدم الرسومية أو قطع الاتصال بالشبكة) تنفذ في جملة finally لضمان التنفيذ.

هذه هيعمليات ملفلإيضاح هذا النقطة.

try:
   f = open("test.txt", encoding = 'utf-8')
   # تنفيذ عمليات ملف
finally:
   f.close()

هذا النوع من التركيبات يضمن إغلاق الملف حتى إذا حدث استثناء.