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

24-10-24 أحمدُ عُبَيْد 1701 0

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

في هذه المقالة ، سنناقش كيفية التعامل مع الاستثناءات في Python باستخدام المحاولة (try) والاستثناء (except).

الخطأ في بايثون نوعين:

1- خطأ بناء او صياغة الجملة البرمجية. وهو أكثر أنواع الاخطاء شيوعا.

امثلة علي أخطاء بناء وكتابة الجملة البرمجية

مثال:


while True print('مرحب يكم')

سيكون الناتج:


Traceback (most recent call last):
File "<string>", line 1, in <module>
while True print('مرحب يكم')
^
SyntaxError: invalid syntax

حدث الخطأ هنا اثناء كتابة الجملة البرمجية. وتم اكتشاف الخطأ في الدالة ()print، نظرا لأن النقطتين (' : ') مفقودتان قبلها.

لاحظ: أنه تم طباعة اسم الملف ورقم السطر الموجود فيه الخطأ.

مثال :


price = 500
if(price > 1000)
print("أنت مؤهل للشحن المجاني")

سيكون الناتج:


During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 2, in <module>
if(price > 1000)
^
SyntaxError: invalid syntax

حدث الخطأ هنا في اثناء كتابة الجملة البرمجية. وتم اكتشاف الخطأ في عبارة if "، حيث يجب أن يتبعها نقطتان (' : ').

ايضاً هناك خطأ في المسافة البادئة لدالة ()print. حيث يجب وضع مسافة بادئة قبلها.

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

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

مثال:


marks = 10 * (1/0)

سيكون الناتج:


Traceback (most recent call last):
File "./prog.py", line 1, in <module>
ZeroDivisionError: division by zero

يسمي هذا الخطأ  ZeroDivisionError وذلك يحدث عندما نقوم بقسمة رقم علي الصفر.

مثال:


x = 'hello' + 2

سيكون الناتج:


Traceback (most recent call last):
File "./prog.py", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

يسمي هذا الخطأ  TypeError وذلك يحدث عندما نحاول اجراء عملية حسابية مثلاً (جمع او طرح رقم) مع سلسة نصية (string).

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

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

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

مثال:


while True:
try:
age = int(input("الرجاء إدخال رقم:"))
break
except:
print("لم يكن ذلك رقمًا صالحًا. حاول ثانية...")

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

كيفية تنفيذ نوع معين من الاستثناءات في بايثون.

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

مثال:


try:
print(ahmed)
except NameError:
print("لم يتم تعريف المتغير ahmed")
except:
print("حدث خطأ")

:سيكون الناتج


لم يتم تعريف المتغير ahmed

في المثال السابق قمنا بتحديد نوع الاستثناء وهو  NameError .

استخدام استثناءات متعددة في بايثون

:فيما يلي مثال يوضح كيفية استخدام استثناءات متعددة


try:
num = int(input("أدخل رقمًا: "))
result = 5 /num
except ZeroDivisionError:
print("لا يمكنك القسمة على صفر.")
except ValueError:
print("إدخال غير صالح. الرجاء إدخال رقم صالح.")
except Exception as e:
print(f"حدث خطأ: {e}")

:في المثال السابق قمنا باستخدام استثناءات متعددة وهي: Exception   و ValueError  و  ZeroDivisionError

استخدام finally وelse في كتلة الاستثناءفي بايثون.

أولاً else : إذا لم يقدم البند try اي استثناءً.  يتم تنفيذ كتلة else فقط.  اي سيتم تنفيذ كتلة Else فقط في حالة عدم حدوث أي استثناء .

مثال:


# كود بايثون لتوضيح عمل try
try:
print("ادخل اسمك")
except:
print("حدث خطأ ما")
else:
print("لم يحدث أي خطأ")

سيكون الناتج:


ادخل اسمك
لم يحدث أي خطأ

ثانياً finally: قد تكون هناك بعض المواقف التي تنتهي فيها الدالة الحالية أثناء معالجة بعض الاستثناءات. ولكن قد تتطلب الدالة بعض الخطوات الإضافية قبل إنهائها، مثل إغلاق ملفأ أو شبكة وما إلى ذلك. لذا، من أجل معالجة هذه المواقف، توفر بايثون كلمة أساسية finally ، والتي يتم تنفيذها دائمًا بعد كتل try و except .

مثال:


try:
x = open("pathfile.txt")
try:
x.write("Lorum Ipsum")
except:
print("حدث خطأ ما أثناء الكتابة إلى الملف")
finally:
x.close()
except:
print("حدث خطأ ما عند فتح الملف")

سيكون الناتج:


حدث خطأ ما عند فتح الملف

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

لمعرفة الاستثناءات المضمنة داخل بايثون يمكنك قراءة المقال التالي من هنا >>



الكلمات الدلالية


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

شارك المقال