<p>كتابة الكود هي نصف المعادلة، والنصف الآخر هو التأكد من أن هذا الكود يعمل بشكل مستقر وموثوق في جميع الظروف. حتى أمهر المبرمجين يواجهون الأخطاء، ولكن ما يميز المحترف هو قدرته على توقع هذه الأخطاء ومعالجتها بأمان. هذا ما يسمى <strong>التعامل مع الاستثناءات (Exception Handling)</strong>، وهو أساس أي تطبيق بايثون قوي وفعال.</p>
<hr>
<h2>ما هو الفرق بين "الخطأ" و "الاستثناء"؟</h2>
<ul>
<li><strong>خطأ نحوي (Syntax Error):</strong> هو خطأ في بناء الجملة (مثل نسيان علامة ترقيم)، ويمنع هذا النوع من الأخطاء تشغيل البرنامج من الأساس.</li>
<li><strong>الاستثناء (Exception):</strong> هو خطأ يظهر أثناء <strong>تشغيل البرنامج</strong> (Runtime Error)، على الرغم من أن الكود صحيح نحوياً. مثال شائع هو محاولة <code>القسمة على صفر</code> (<code>ZeroDivisionError</code>) أو محاولة فتح ملف غير موجود (<code>FileNotFoundError</code>).</li>
</ul>
<p>الهدف من التعامل مع الاستثناءات هو منع البرنامج من الانهيار وتوجيه المستخدم أو البرنامج إلى مسار بديل آمن.</p>
<hr>
<h2>البنية الأساسية: كتلة <code>try...except</code></h2>
<p>في بايثون، يتم التعامل مع الاستثناءات باستخدام الكتلة <code>try...except</code>. الفكرة بسيطة: "حاول" (Try) تنفيذ جزء من الكود، وإذا حدث استثناء، "استثن" (Except) هذا الخطأ ونفذ إجراءً بديلاً:</p>
<pre><code>
try:
# هذا الجزء هو الذي نتوقع حدوث خطأ فيه
numerator = 10
denominator = int(input("Enter a number to divide 10 by: "))
result = numerator / denominator
print(f"The result is: {result}")
except ZeroDivisionError:
# يتم تنفيذه في حال حدوث خطأ القسمة على صفر
print("Error: You cannot divide by zero. Please try another number.")
except ValueError:
# يتم تنفيذه في حال أدخل المستخدم نصاً بدلاً من رقم
print("Error: Invalid input. Please enter a valid integer.")
except Exception as e:
# يتم تنفيذه لأي استثناء آخر لم يتم تحديده
print(f"An unexpected error occurred: {e}")
</code></pre>
<hr>
<h2>إضافات تجعل الكود أكثر مرونة: <code>else</code> و <code>finally</code></h2>
<p>لزيادة التحكم في سير البرنامج، يمكن إضافة عبارتين اختياريتين إلى الكتلة:</p>
<dl>
<dt><strong><code>else</code></strong></dt>
<dd>يتم تنفيذ هذا الجزء <strong>فقط</strong> إذا لم يقع أي استثناء في كتلة <code>try</code>. يستخدم لتعليمات تعتمد على نجاح محاولة <code>try</code>.</dd>
<dt><strong><code>finally</code></strong></dt>
<dd>يتم تنفيذ هذا الجزء <strong>دائماً</strong> بغض النظر عما إذا كان قد حدث خطأ أم لا. وغالباً ما يستخدم لتنظيف الموارد، مثل إغلاق ملفات أو اتصالات شبكة مفتوحة.</dd>
</dl>
<pre><code>
try:
file = open("data.txt", "r")
# ... قراءة الملف ...
except FileNotFoundError:
print("File not found!")
finally:
# سيتم إغلاق الملف هنا دائماً، سواء نجحت القراءة أم فشلت
if 'file' in locals() and not file.closed:
file.close()
print("File closed safely.")
</code></pre>
<hr>
<h2>فوائد التعامل مع الاستثناءات في كودك</h2>
<p>إن إضافة مهارة التعامل مع الاستثناءات إلى مجموعة أدواتك البرمجية هي ما يفصل بين المبرمج الذي يكتب سكربتات مؤقتة والمطور الذي يبني أنظمة متكاملة تدوم طويلاً:</p>
<ul>
<li><strong>الموثوقية:</strong> يمنع الانهيار المفاجئ للبرنامج.</li>
<li><strong>التشخيص:</strong> يساعدك في تسجيل وتحديد مصدر المشكلة بدقة.</li>
<li><strong>إدارة الموارد:</strong> يضمن إغلاق الموارد الهامة (مثل الملفات) حتى في حال فشل الكود.</li>
</ul>
<p>لا تخف من الأخطاء، بل تعلم كيف تستوعبها وتتحكم فيها!</p>
تعليقات
إرسال تعليق