اثناء تشغيل البرنامج قد يحدث اخطاء Errors في البرنامج او ما يسمى بالاستثناءات Exceptions وهو ما سيؤدي الى توقف البرنامج، مثلا اثناء تنفيذ اوامر البرنامج يتم القسمة على 0

تشغيل
x = 5
y = 0
z = x / y # ZeroDivisionError
print("The result is:")
print(z) 

سيتوقف البرنامج ولن يكمل تنفيذ الاوامر، وسيكون نوع ​الخطأ ZeroDivisionError، بالطبع لن نريد ان يتوقف البرنامج على اي حال لذا نستخدم ما يعرف ب”التعامل مع الاستثناءات” Exception Handling.

try … except

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

تشغيل
x = 5
y = 0
try:
    z = x / y # ZeroDivisionError
    print("Division Succeded")
     
except:
    z = float("inf")# ما لا نهاية
    
print("The result is:")
print(z)
ملحوظة: ناتج القسمة على 0 يساوي ما لا نهاية!!

الكود بالاعلى يقول اذا حدث اي ​خطأ داخل فقرة ال try توقف و نفذ الكود في فقرة ال except ثم اكمل البرنامج. ماذا اذا حدث ​استثناء اخر داخل فقرة try غير القسمة على ال 0، سوف يتم تنفيذ الكود داخل except وسوف تكون قيمة z ما لا نهاية وهذا غير صحيح !!!!
نستطيع تعريف تحديد نوع الاستثناء لكي ننفذ فقرة except

x = 5
y = 0
try:
    z = x / y 
    print("Division Succeded")
# نحدد نوع الاستثناء الذي ننفذ عنده الكود     
except ZeroDivisionError:
    z = float("inf")# ما لا نهاية
    
print("The result is:")
print(z)

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

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

الاستثناءات المتعددة

نستطيع تعريف اكثر من ​فقرة except في بايثون ونستطيع تحديد نوع الخطأ المخصص لكل فقرة

تشغيل
x = 5
y = 0
try:
    z = x / y # 
# نحدد نوع الاستثناء الذي ننفذ عنده الكود     
except ZeroDivisionError:
    z = float("inf")# ما لا نهاية
    print("Division Succeded")
except :
    # الفقرة الافتراضية
    z = 0
    print("Another Error")
    
print("The result is:")
print(z)

الفقرة الافتراضية تكون اخر فقرة فيها except، ويتم تنفيذها اذا كان نوع الاستثناء ليس له فقرة خاصة به.

else

تستخدم else مع try اذا اردنا ان ننفذ كود في حالة عدم حدوث Exception داخل ال try

تشغيل
x = 5
y = 1
try:
    z = x / y 
    print("Division Succeded")
     
except ZeroDivisionError:
    z = float("inf")
else:
    print("No Exception")
    
print("The result is:")
print(z)

finally

كما لاحظنا في الامثلة السابقة، اذا حدث Exception داخل try، لا يتم تنفيذ اي اوامر اخرى في try و ننتقل الى فقرة except، لكن ما اذا اردنا تنفيذ كود سواء حدث exception او لا
* نستطيع ان ننقل ذلك الكود بعد try وبعد except في حالة ان الكود ليس داخل دالة
* نستطيع ان نستخدم finally اذا كان الكود داخل دالة حيث ان finally سوف يتم تنفيذها قبل كلمة return سواء كانت في try او except

تشغيل
def division(x, y):
  try:
    z = x / y
    return z
  except ZeroDivisionError:
    return  float("inf")# ما لا نهاية
  except :
    return 0
  finally:
    print("Division Done")

print(division(5,2))
print("--------------------------")
print(division(1,0))

في المثال السابق سنجد ان “Division Done” يتم طباعتها في كل الاحوال رغم اننا قمنا بعمل return


guest
0 تعليقات
Inline Feedbacks
اظهر كل التعليقات