مدیریت خطا با try و except در پایتون
آموزش

مدیریت خطا با try و except در پایتون

راهنمای گام‌به‌گام مهار خطاهای زمان اجرا در پایتون با بلوک‌های try و except همراه با بررسی خطاهای رایج و ساختار اصولی.

تحریریه‌ی دینا کد
نویسنده
۵ دقیقه مطالعه۰ بازدید
اشتراک گذاری۰
فهرست مطالب
  1. ۱تفاوت خطای دستوری با استثنا
  2. ۲ساختار پایه بلوک try و except
  3. ۳گرفتن جزئیات خطا و مدیریت چند استثنا
  4. ۴ترتیب قرارگیری بلوک‌های except
  5. ۵اشتباه رایج در استفاده از try و except

وقتی کدی می‌نویسید که ورودی کاربر را دریافت می‌کند یا فایلی را از دیسک می‌خواند، بروز خطا اجتناب‌ناپذیر است. اگر کاربر به جای عدد یک کلمه تایپ کند، اجرای برنامه با خطای زمان اجرا ناگهان متوقف می‌شود. برای جلوگیری از این توقف ناگهانی، پایتون سازوکار مدیریت استثناها را در قالب بلوک‌های 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 برای آزاد کردن منابع سیستم خواهد بود.

تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید تا نویسنده‌ی مطلب پاسخ بدهد.

مطالب مرتبط

از همین دسته
مدیریت خطا در Rust با Result و Option
آموزش

مدیریت خطا در Rust با Result و Option

زبان Rust به جای ساختارهای سنتی استثنا از نوع‌های Result و Option برای مدیریت شفاف و پیش‌بینی‌پذیر خطاها در زمان کامپایل استفاده می‌کند.

تحریریه‌ی دینا کد۶ دقیقه
تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام
آموزش

تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام

واحدهای px، em و rem هرکدام برای بخش مشخصی از صفحه‌آرایی وب طراحی شده‌اند و انتخاب نادرست آن‌ها مقیاس‌پذیری و دسترسی‌پذیری سایت را مختل می‌کند.

تحریریه‌ی دینا کد۶ دقیقه
مدیریت خطا با try و except در پایتون — دینا کد