القائمة الرئيسية

الصفحات

دورة البرمجة بلغة بايثون - الدرس الثاني والثلاثون (معالجة الاستثناءات)

دورة البرمجة بلغة بايثون - الدرس الثاني والثلاثون (معالجة الاستثناءات)

دورة البرمجة بلغة بايثون - الدرس الثاني والثلاثون (معالجة الاستثناءات)

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


استثناءات بايثون

يوجد في بايثون العديد من الاستثناءات المضمنة التي تظهر عندما يواجه برنامجك خطأ (حدث خطأ ما في البرنامج).


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


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


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


اصطياد الاستثناءات في بايثون

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


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


وبالتالي يمكننا اختيار العمليات التي يجب إجراؤها بمجرد اكتشاف الاستثناء. اليك مثال بسيط.

# import module sys to get the type of exception
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!", sys.exc_info()[0], "occurred.")
        print("Next entry.")
        print()
print("The reciprocal of", entry, "is", r)


الناتج

The entry is a
Oops! <class 'ValueError'> occurred.
Next entry.

The entry is 0
Oops! <class 'ZeroDivisionError'> occured.
Next entry.

The entry is 2
The reciprocal of 2 is 0.5


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


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


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


نظرًا لأن كل استثناء في بايثون يرث من فئة Exception الأساسية ، يمكننا أيضًا تنفيذ المهمة أعلاه بالطريقة التالية:

# import module sys to get the type of exception
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except Exception as e:
        print("Oops!", e.__class__, "occurred.")
        print("Next entry.")
        print()
print("The reciprocal of", entry, "is", r)


هذا البرنامج له نفس إخراج البرنامج أعلاه.


اصطياد استثناءات محددة في بايثون

في المثال أعلاه ، لم نذكر أي استثناء محدد في بند الاستثناء.


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


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


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

try:
   # do something
   pass

except ValueError:
   # handle ValueError exception
   pass

except (TypeError, ZeroDivisionError):
   # handle multiple exceptions
   # TypeError and ZeroDivisionError
   pass

except:
   # handle all other exceptions
   pass


انشاء الاستثناءات في بايثون

في برمجة بايثون ، تظهر الاستثناءات عند حدوث أخطاء في وقت التشغيل. يمكننا أيضًا انشاء الاستثناءات يدويًا باستخدام كلمة زيادة.


يمكننا اختياريًا تمرير القيم إلى الاستثناء لتوضيح سبب ظهور هذا الاستثناء.

>>> 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("Enter a positive integer: "))
...     if a <= 0:
...         raise ValueError("That is not a positive number!")
... except ValueError as ve:
...     print(ve)
...    
Enter a positive integer: -2
That is not a positive number!


جملة tray مع شرط else

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


ملاحظة: لا يتم التعامل مع الاستثناءات في عبارة else من خلال شرط except.


لنلقي نظرة على مثال:

# program to print the reciprocal of even numbers

try:
    num = int(input("Enter a number: "))
    assert num % 2 == 0
except:
    print("Not an even number!")
else:
    reciprocal = 1/num
    print(reciprocal)

الناتج

إذا مررنا رقم فردي:

Enter a number: 1
Not an even number!

إذا مررنا رقمًا زوجيًا ، فسيتم حساب المعاملة بالمثل وعرضها.

Enter a number: 4
0.25

ومع ذلك ، إذا مررنا بـ 0 ، نحصل على ZeroDivisionError لأن كتلة الكود داخل else لا يتم التعامل معها من خلال استثناء except.

Enter a number: 0
Traceback (most recent call last):
  File "<string>", line 7, in <module>
    reciprocal = 1/num
ZeroDivisionError: division by zero


جملة try...finally

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


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


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


فيما يلي مثال على عمليات الملف لتوضيح ذلك.

try:
   f = open("test.txt",encoding = 'utf-8')
   # perform file operations
finally:
   f.close()


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

reaction:
Ahmed Taher
Ahmed Taher
مدون من العراق . احب البرمجة وكل ما يتعلق بالشبكات والسيرفرات وامن المعلومات . واسعى الى توفير جميع المصادر والمواد للامتحانات الدولية.

تعليقات