Table of Contents
چرا این فصل مهم است؟
هیچ برنامهنویسی (حتی حرفهایها) بدون خطا کد نمینویسد. تفاوت یک مبتدی و یک برنامهنویس خوب در این نیست که «خطا نکند»، بلکه در این است که بلد باشد خطا را پیدا و برطرف کند. این فصل به شما کمک میکند:
- انواع خطاها را بشناسید
- پیامهای خطا را بخوانید و معنیشان را بفهمید
- از
tryوexceptبرای مدیریت خطاها استفاده کنید - روشهایی برای اشکالزدایی (debugging) یاد بگیرید
در این فصل تمرکز روی ایدهها و مهارتهای عمومی است؛ جزئیات فنی هر زیرموضوع در زیربخشهای خودش (انواع خطاها، try/except و …) باز میشود.
خطا (Error) در برنامه یعنی چه؟
وقتی برنامهٔ شما نتواند کاری را که باید انجام دهد ادامه دهد و اجرا متوقف شود، با یک «خطا» روبهرو شدهاید. معمولاً پایتون:
- برنامه را در همان نقطه متوقف میکند
- یک پیام خطا روی صفحه نمایش میدهد
هدف ما در این فصل این است که:
- قبل از اجرا تا جایی که میشود خطاها را با دقت در نوشتن و خواندن کد کم کنیم
- حین اجرا خطاها را تشخیص دهیم و دربارهشان اطلاعات بگیریم
- بعد از رخ دادن خطا، علت را پیدا کنیم و آن را برطرف کنیم
به مجموع این کارها میگوییم اشکالزدایی (Debugging).
تفاوت خطا و باگ
در گفتگوهای روزمره، «خطا» و «باگ» گاهی به یک معنا استفاده میشوند، اما بهتر است یک تفکیک ساده داشته باشیم:
- خطا (Error)
- چیزی است که پایتون رسماً به شما گزارش میکند
- معمولاً با یک پیام خطا همراه است
- باعث توقف اجرا میشود (مگر اینکه مدیریت شود)
- باگ (Bug)
- یعنی برنامهٔ شما رفتار اشتباه، غیرمنتظره یا نامطلوب دارد
- ممکن است هیچ پیام خطایی ندهد
- تشخیصش معمولاً سختتر است، چون از نظر پایتون همهچیز «مجاز» است، ولی از نظر منطق مسئله غلط است
مثال باگ بدون پیام خطا:
price = 100
discount = 10 # درصد
final_price = price + price * discount / 100 # اینجا در واقع داریم تخفیف را اضافه میکنیم!
print(final_price)
این کد از نظر پایتون کاملاً درست است و خطایی نمیدهد، اما منطقش اشتباه است؛ باید از - استفاده میکردیم، نه +. این یک باگ منطقی است.
خطاها از کجا میآیند؟
چند منبع رایج:
- اشتباه در تایپ دستورها
- نام تابع یا متغیر را اشتباه مینویسید
- پرانتز، کوتیشن، دو نقطه و … را فراموش میکنید
- اشتباه در نوع دادهها
- سعی میکنید یک رشته را با عدد جمع کنید
- رشتهای که قرار است عدد باشد، در واقع متن نامعتبر است
- اشتباه در منطق برنامه
- شرطها (
if…) اشتباه نوشته شدهاند - حلقهها (
for،while) درست خاتمه داده نشدهاند - فرمولهای ریاضی را اشتباه پیاده کردهاید
- وابستگی به چیزهای بیرون از برنامه
- فایل وجود ندارد یا مسیرش اشتباه است
- اینترنت قطع است
- ورودی کاربر آنطور که انتظار داشتید نیست
در فصلهای بعدی، بسیاری از این منابع خطا را در زمینههای خاص (فایلها، وب، علم داده و …) خواهید دید؛ این فصل روی اصول کلی تمرکز دارد.
پیامهای خطا در پایتون چه شکلیاند؟
وقتی برنامهای خطا میدهد، معمولاً چیزی شبیه این میبینید:
Traceback (most recent call last):
File "test.py", line 2, in <module>
print(1 / 0)
ZeroDivisionError: division by zeroچیزهایی که باید یاد بگیرید از درون این متن پیدا کنید:
- نام فایل (
test.py) - شمارهٔ خط (
line 2) - بخشی از کدی که مشکل دارد (
print(1 / 0)) - نوع خطا (
ZeroDivisionError) - توضیح کوتاه خطا (
division by zero)
در زیربخش «خواندن پیامهای خطا» این ساختار را دقیقتر میبینید. در این فصل فقط به این نکته توجه کنید که:
پیام خطاها را نادیده نگیرید؛ آنها مهمترین راهنمای شما برای اشکالزدایی هستند.
روند کلی اشکالزدایی
برای برطرف کردن یک خطا یا باگ، معمولاً یک روند تکراری را طی میکنیم:
- مشکل را مشاهده کنید
- پیام خطا را بخوانید
- یا خروجی اشتباه/رفتار عجیب را ببینید
- محل تقریبی مشکل را پیدا کنید
- از شمارهٔ خط در پیام خطا استفاده کنید
- یا قطعه کدی که نتیجهٔ اشتباه میدهد را محدود کنید
- دلیل احتمالی را حدس بزنید
- نوع خطا را ببینید (مثلاً
TypeError،NameErrorو …) - ورودیها، نوع دادهها و منطق خودتان را بررسی کنید
- کد را کمی تغییر دهید
- پرینت بگذارید (
print) تا بفهمید متغیرها چه مقداری دارند - بخشی از کد را موقتاً کامنت کنید
- یا از
try/exceptاستفاده کنید تا اطلاعات بیشتری بگیرید - دوباره اجرا کنید و نتیجه را ببینید
- اگر درست شد، تغییر را تثبیت کنید
- اگر هنوز مشکل هست، حدستان را اصلاح کنید و دوباره تلاش کنید
این یک فرآیند مرحلهبهمرحله است، نه یک کار یکباره.
فرق «مدیریت خطا» و «رفع خطا»
دو کار متفاوت ولی مرتبط:
- رفع خطا (Fixing)
- یعنی کدی بنویسید که اصلاً خطا رخ ندهد
- مثلاً قبل از تقسیم، بررسی کنید که مخرج صفر نباشد
- مدیریت خطا (Handling)
- یعنی اگر هم خطا رخ داد، برنامه مودبانه و کنترلشده رفتار کند
- از
try/exceptاستفاده میکنیم - به کاربر پیام مناسب نشان میدهیم، یا راه جایگزین اجرا میکنیم، یا فقط خطا را ثبت میکنیم
در این فصل، هر دو را خواهید دید؛ اما فصل «try و except» به طور خاص روی مدیریت خطا تمرکز میکند.
اشکالزدایی با چاپ کردن (`print`)
یکی از سادهترین و مؤثرترین روشهای اشکالزدایی برای مبتدیها استفاده از print است. ایدهٔ ساده است:
- قبل و بعد از بخشهای مهم کد، مقادیر متغیرها را چاپ کنید
- ببینید آیا مقدارها همان چیزی هستند که انتظار داشتید یا نه
مثلاً اگر حلقهتان درست کار نمیکند:
total = 0
for i in range(5):
print("قبل از جمع، i =", i, "total =", total)
total = total + i
print("بعد از جمع، i =", i, "total =", total)
print("نتیجهٔ نهایی:", total)این نوع پرینتها شاید در نسخهٔ نهایی برنامه نمانند، اما در طول اشکالزدایی ابزار اصلی شما هستند.
عادتهای خوب برای کاهش خطا
اشکالزدایی راحتتر میشود اگر از ابتدا چند عادت را رعایت کنید:
- کد را کمکم بنویسید و زودبهزود اجرا کنید
- بهجای اینکه ۵۰ خط کد بنویسید و بعد اجرا کنید، هر ۵–۱۰ خط یکبار اجرا کنید
- اگر خطایی پیش آمد، میدانید در همین بخش تازهنوشته شده است
- کد را تمیز و خوانا بنویسید
- اسمهای معنیدار برای متغیرها
- تورفتگی (indentation) منظم
- استفاده از کامنتهای کوتاه در جاهای پیچیده
- این کارها در فصل «کد تمیز» بیشتر بررسی میشود، ولی همینجا هم کمک میکند بدانید کجا را باید نگاه کنید
- قبل از اجرا، کد را با صدای بلند برای خودتان بخوانید
- خطبهخط تصور کنید کامپیوتر چه کاری انجام میدهد
- خیلی وقتها خودتان قبل از اجرا متوجه اشتباه میشوید
- نمونهٔ ورودیهای مختلف را امتحان کنید
- فقط «حالت ایدهآل» را تست نکنید
- ورودیهای عجیب، خالی، صفر، منفی و … را هم چک کنید
برخورد درست با پیامهای خطا
وقتی اولینبار با پیامهای خطا روبهرو میشوید، ممکن است طولانی و ترسناک بهنظر برسند. اما:
- اغلب دو–سه خط آخر مهمترین بخش هستند (نوع خطا و توضیح کوتاه)
- با تمرین، بهتدریج چشمتان به آنها عادت میکند
- بهجای ترسیدن یا بستن پنجره، سعی کنید مثل یک «معما» به آن نگاه کنید:
- چه نوع خطایی است؟
- در کدام فایل و کدام خط؟
- کدام دستور مشکلساز شده است؟
در زیربخش «خواندن پیامهای خطا» شکلهای مختلفی از آن را میبینید.
نقش IDE و ابزارها در اشکالزدایی
در فصلهای مربوط به IDE و ابزارها اشاره شده که محیطی مثل VS Code امکاناتی مثل:
- برجسته کردن خطای نحوی (Syntax) قبل از اجرا
- نمایش شمارهٔ خط
- گاهی پیشنهاد خودکار کد
را دارد. در زمینهٔ اشکالزدایی:
- پیدا کردن خطهایی که مشکل دارند سریعتر میشود
- میتوانید از «نقاط توقف» (breakpoints) و «اجرای قدمبهقدم» استفاده کنید (در بخش استراتژیهای اشکالزدایی بیشتر گفته میشود)
اما حتی در سادهترین حالت (ترمینال + ویرایشگر معمولی)، اصولی که در این فصل میآموزید کاملاً کاربرد دارند.
خلاصهٔ فصل
در این فصل با چند ایدهٔ اساسی آشنا شدید:
- خطا یعنی برنامه متوقف میشود و پیام خطا میدهد؛
- باگ یعنی رفتار غلط، حتی اگر پیامی هم نباشد؛
- پیامهای خطا راهنمای شما هستند، نه دشمن شما؛
- اشکالزدایی یک روند مرحلهبهمرحله است: مشاهده → حدس → آزمایش → تکرار؛
- استفاده از
print، نوشتن تدریجی کد و عادتهای خوب نوشتن، اشکالزدایی را بسیار آسانتر میکند؛ - در زیربخشهای بعدی، انواع خطا، خواندن پیامها،
try/exceptو روشهای حرفهایتر اشکالزدایی را میبینید.
در ادامه، ابتدا به طور مشخص به انواع خطاها در پایتون میپردازیم.