آموزش برنامه نویسی

آموزش دیباگ پایتون؛ خواندن خطا و اصلاح تمرین با مثال

یک روش قدم به قدم برای خطایابی تمرین های پایتون؛ خواندن Traceback، بررسی نوع داده و مرز ورودی ها، همراه پروژه کوچک محاسبه میانگین نمره و پاسخ تمرین.

آموزش دیباگ پایتون؛ خواندن خطا و اصلاح تمرین با مثال

وقتی یک تمرین پایتون اجرا نمی شود، حذف تصادفی خط ها یا عوض کردن چند بخش با هم معمولاً فهم مسئله را سخت تر می کند. دیباگ یعنی خطا را با یک ورودی مشخص بازتولید کنید، محل و دلیل آن را پیدا کنید و بعد از اصلاح دوباره همان حالت را بیازمایید. در این راهنما همین روش را روی یک مثال کوچک اجرا می کنیم.

پیش نیاز، آشنایی مقدماتی با متغیر، شرط، حلقه و تابع است. اگر تازه شروع کرده اید، مسیر شروع پایتون از صفر را ببینید. برای تمرین بیشتر، این مطلب را کنار تمرین های پایتون با پاسخ تشریحی استفاده کنید.

از آخرین خط پیام خطا شروع کنید

در خطاهای زمان اجرا، بخش پایانی پیام معمولاً نوع خطا و توضیح آن را نشان می دهد. بالاتر از آن، Traceback مسیر فراخوانی ها را با نام فایل و شماره خط نمایش می دهد. ابتدا نوع خطا را بخوانید؛ سپس نزدیک ترین خط مربوط به کد خودتان را بررسی کنید. اگر برنامه از چند تابع عبور کرده، فقط آخرین تابع را نبینید؛ ورودی ای که به آن رسیده نیز مهم است.

برای نمونه، جمع کردن متن و عدد می تواند TypeError بدهد. تبدیل متن نامعتبر به عدد با int ممکن است ValueError ایجاد کند. NameError معمولاً به نام تعریف نشده اشاره دارد و IndexError می تواند از دسترسی به عضو ناموجود فهرست بیاید. SyntaxError پیش از اجرای عادی برنامه گزارش می شود؛ محل علامت گذاری شده همیشه دقیقاً همان نویسه ای نیست که باید اصلاح کنید.

یک دفترچه کوتاه برای بازتولید خطا بسازید

  1. ورودی دقیق و دستور اجرای فایل را ثبت کنید.
  2. نتیجه مورد انتظار و خروجی واقعی را جدا بنویسید.
  3. نوع داده را با type(value) و مقدار را با repr(value) بررسی کنید؛ فاصله خالی ممکن است در چاپ عادی دیده نشود.
  4. مثال را تا کوچک ترین ورودی مشکل دار ساده کنید.
  5. یک علت را اصلاح کنید و ورودی قبلی را دوباره اجرا کنید.

اگر خطا داخل حلقه رخ می دهد، شماره ردیف را کنار مقدار چاپ کنید. هنگام اشتراک پیام خطا، داده شخصی، رمز، کلید و آدرس خصوصی را حذف کنید؛ برای بررسی می توان داده ساختگی با همان نوع و شکل ساخت.

پروژه تمرینی: میانگین نمره با گزارش ورودی های نامعتبر

فرض کنید نمره ها به صورت رشته وارد می شوند و هر نمره باید عدد صحیح بین صفر و بیست باشد. رشته خالی، متن و عدد خارج از محدوده باید گزارش شوند. در این تمرین، سیاست ما کنارگذاشتن ردیف نامعتبر همراه با ثبت علت است؛ در یک سامانه واقعی ممکن است لازم باشد کل عملیات متوقف شود.

کد زیر را در فایل debug_scores.py ذخیره کنید. با Python 3 اجرا می شود و به بسته اضافی نیاز ندارد:

def parse_score(text):
    if not isinstance(text, str):
        raise TypeError("score must be text")
    value = int(text.strip())
    if not 0 <= value <= 20:
        raise ValueError("score must be between 0 and 20")
    return value


def average_scores(raw_scores):
    accepted = []
    rejected = []
    for line, raw in enumerate(raw_scores, start=1):
        try:
            accepted.append(parse_score(raw))
        except (ValueError, TypeError) as error:
            rejected.append((line, str(error)))
    average = sum(accepted) / len(accepted) if accepted else None
    return average, rejected


if __name__ == "__main__":
    average, errors = average_scores(["18", "", "twenty", "21", "16"])
    print(average)
    print(len(errors))
    for line, message in errors:
        print(line, message)

با دستور python debug_scores.py، دو خط اول خروجی باید 17.0 و 3 باشند. پس از آن شماره و علت سه ورودی نامعتبر چاپ می شود. متن بعضی خطاهای داخلی ممکن است با نسخه پایتون تفاوت جزئی داشته باشد.

چرا هر خطای احتمالی را نمی گیریم؟

تابع parse_score مسئول تبدیل و بررسی محدوده است. تابع average_scores تصمیم می گیرد با ردیف نامعتبر چه کند. گرفتن ValueError و TypeError در این بخش مشخص، هدف روشنی دارد؛ اما عبارتی مثل except: pass می تواند ایراد برنامه را پنهان کند و نتیجه ناقص را موفق نشان دهد.

اگر هیچ نمره معتبری وجود نداشته باشد، میانگین را None برمی گردانیم تا با صفر واقعی اشتباه نشود. شرط if accepted هم از تقسیم بر صفر جلوگیری می کند. در گام بعد می توانید این داده ها را از فایل بخوانید؛ آموزش کار با فایل و CSV در پایتون و پروژه گزارش هزینه ها با CSV مسیر ادامه مناسبی هستند.

تمرین با پاسخ قابل بررسی

پیش از اجرا، نتیجه این حالت ها را روی کاغذ بنویسید:

  • ["0", "20"]: میانگین 10 و بدون ردیف ردشده.
  • ["", "21"]: میانگین None و دو ردیف ردشده.
  • [" 18 ", "16"]: میانگین 17؛ فاصله ابتدا و انتهای رشته حذف می شود.
  • []: میانگین None و فهرست خطای خالی؛ داده ای برای محاسبه وجود ندارد.

حالا یک خطای منطقی بسازید: شرط محدوده را طوری تغییر دهید که 20 را نپذیرد. برنامه ممکن است بدون توقف اجرا شود، ولی آزمون مرزی شما باید اختلاف را نشان دهد. هر نتیجه غلط، پیام خطای اجرایی تولید نمی کند؛ به همین دلیل بررسی خروجی مورد انتظار ضروری است.

چه زمانی از مدرس کمک بگیریم؟

اگر ورودی کوچک، پیام کامل خطا و نتیجه مورد انتظار را آماده کرده اید و هنوز علت روشن نیست، همین سه مورد را همراه بخش مرتبط کد برای مدرس بفرستید. این کار بازخورد را دقیق تر می کند. برای تمرین منظم، برنامه تمرین کنار کلاس را ببینید؛ همچنین می توانید مسیرهای فعلی دوره های آکادمی گلجام را بررسی کنید.

مرجع تکمیلی: بخش خطاها و استثناها در مستندات رسمی پایتون.

برای شروع مسیر یادگیری آماده‌ای؟

دوره‌های پروژه‌محور آکادمی گلجام را ببین.

مشاهده دوره‌ها
مشاوره رایگان مشاوره