فهرست مطالب
وقتی کدی مینویسید که ورودی کاربر را دریافت میکند یا فایلی را از دیسک میخواند، بروز خطا اجتنابناپذیر است. اگر کاربر به جای عدد یک کلمه تایپ کند، اجرای برنامه با خطای زمان اجرا ناگهان متوقف میشود. برای جلوگیری از این توقف ناگهانی، پایتون سازوکار مدیریت استثناها را در قالب بلوکهای try و except فراهم کرده است.
تفاوت خطای دستوری با استثنا
در پایتون خطاهایی که برنامه با آنها روبهرو میشود دو دستهاند:
۱. خطاهای دستوری یا نگارشی (Syntax Errors) که مفسر در زمان خواندن ساختار کد پیش از اجرا شناسایی میکند؛ مثل فراموش کردن دونقطه یا پرانتز باز مانده.
۲. استثناها (Exceptions) که ساختار نگارشی درستی دارند اما هنگام اجرای دستور رخ میدهند؛ مانند تقسیم بر صفر با عنوان ZeroDivisionError، ارجاع به متغیر تعریفنشده با عنوان NameError، یا ناسازگاری جنس دادهها مثل تلاش برای جمع زدن رشته و عدد صحیح با عنوان TypeError.
استثناها برخلاف خطاهای دستوری برنامه را بیاستثنا از بین نمیبرند؛ شما میتوانید با کدنویسی مشخص آنها را مهار کنید و روند اجرای برنامه را نجات دهید.
ساختار پایه بلوک try و except
برای کنترل شرایط خطا، بخشی از برنامه را که ممکن است دچار مشکل شود درون بلوک try قرار میدهید. مفسر ابتدا دستورهای داخل try را اجرا میکند. اگر خطایی رخ ندهد، بخش except نادیده گرفته میشود. اما اگر خطایی رخ دهد، ادامه دستورهای try متوقف شده و به بخشی میرود که استثنای نامبرده را مدیریت کند.
نمونه دریافت عدد صحیح از کاربر را در این بخش بررسی میکنیم:
python# دریافت ورودی از کاربر تا زمان وارد کردن عدد معتبر
while True:
try:
adad = int(input("لطفاً یک عدد صحیح وارد کنید: "))
break
except ValueError:
print("مقدار واردشده عدد صحیح نیست. دوباره تلاش کنید.")
print(f"عدد ثبت شد: {adad}")
خروجی در صورتی که کاربر ابتدا کلمه salam و سپس عدد ۱۲ را وارد کند:
textلطفاً یک عدد صحیح وارد کنید: salam
مقدار واردشده عدد صحیح نیست. دوباره تلاش کنید.
لطفاً یک عدد صحیح وارد کنید: ۱۲
عدد ثبت شد: ۱۲
گرفتن جزئیات خطا و مدیریت چند استثنا
یک بخش try میتواند چندین بخش except داشته باشد تا برای هر رخداد، رفتار متفاوتی نشان دهد. همچنین میتوانید با کلمه کلیدی as شیء استثنا را درون متغیر ذخیره کنید تا پیام خطای سیستم در دسترس باشد:
pythonimport sys
try:
with open("data.txt", "r") as file:
mohtava = file.readline()
adad = int(mohtava.strip())
except OSError as khata_file:
# مدیریت خطای مربوط به باز کردن یا دسترسی به فایل
print(f"خطای فایل: {khata_file}")
except ValueError:
# خطای تبدیل رشته نامعتبر به عدد
print("محتوای فایل قابلیت تبدیل به عدد صحیح را ندارد.")
except Exception as khata_nashenakhte:
# ثبت خطاهای غیرمنتظره دیگر و ارسال مجدد آن
print(f"خطای غیرمنتظره رخ داد: {type(khata_nashenakhte)}")
raise
در سلسلهمراتب پایتون، کلاس BaseException سرشاخه تمام استثناها است و کلاس Exception پایه تمام خطاهای برنامهنویسی غیرمرگبار به شمار میآید. استثناهایی مانند KeyboardInterrupt مستقیماً زیرمجموعه BaseException هستند تا فشردن کلیدهای خروج توسط کاربر بیدلیل مهار نشود.
ترتیب قرارگیری بلوکهای except
اگر در یک عبارت شرطی کلاس فرزند و کلاس پدر تعریف شده باشند، پایتون اولین کلاسی را که با خطا تطابق داشته باشد اجرا میکند. بنابراین اگر کلاس پدر مانند Exception را در اولین خط قرار دهید، استثناهای جزئیتر بعد از آن هرگز اجرا نخواهند شد. همیشه استثناهای اختصاصیتر را اول و کلاسهای عمومیتر را در انتها بیاورید.
اشتباه رایج در استفاده از try و except
بزرگترین اشتباه، نوشتن except: خالی یا مهار بیدلیل کلاس کلی Exception بدون ثبت لاگ یا انتقال مجدد آن است. این کار خطاها را پنهان میکند و وقتی متغیری به اشتباه تایپ شده باشد یا برنامه دچار نقص منطقی شود، هیچ ردی در خروجی به جا نمیگذارد.
اگر به دنبال یادگیری ساختاریافته اصول زبان پایتون، مفاهیم پیشرفتهتر و الگوهای تمیز برنامهنویسی هستید، دوره پایتون از صفر تا برنامهنویس مسیر یادگیری کامل این زبان را گامبهگام پوشش میدهد.
گام بعدی شما پس از تسلط بر مهار استثناهای پایه، استفاده از بخشهای مکمل else برای اجرای کدهای موفق و finally برای آزاد کردن منابع سیستم خواهد بود.




نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.