Table of Contents
خطا در برنامه یعنی چه؟
در فصل «خطاها و اشکالزدایی» بهطور کلی با مفهوم خطا آشنا شدهاید. در این بخش روی یک موضوع خاص تمرکز میکنیم: انواع خطاها در پایتون و اینکه هر کدام چه نشانههایی دارند.
شناخت نوع خطا کمک میکند:
- سریعتر منبع مشکل را پیدا کنید.
- پیام خطا را بهتر بخوانید.
- در آینده از تکرار همان اشتباه جلوگیری کنید.
در این فصل روی سه دستهٔ اصلی تمرکز میکنیم:
- خطاهای نحوی (Syntax Errors)
- خطاهای زمان اجرا (Runtime Errors / Exceptions)
- خطاهای منطقی (Logic Errors)
هرکدام را جداگانه میبینیم.
۱. خطاهای نحوی (Syntax Errors)
خطای نحوی یعنی کد شما از نظر «قانونهای زبان پایتون» اشتباه است؛ یعنی پایتون حتی نمیتواند شروع به اجرای آن کند، چون «شکل» دستور غلط است.
مثال ساده:
print("سلام"در اینجا پرانتز بسته نشده است. اگر این کد را اجرا کنید، پیامی شبیه این میبینید:
SyntaxError: '(' was never closedویژگیهای خطای نحوی:
- معمولاً قبل از اجرای برنامه پیدا میشود.
- بیشتر مربوط به اشتباهات تایپی و فراموشکردن علائم است.
نمونههای رایج خطای نحوی:
- فراموش کردن دونقطه
:در انتهای دستورهای کنترلی مثلif،for،while,def:
if x > 10
print("بزرگتر از ۱۰ است")پیام احتمالی:
SyntaxError: expected ':'- استفادهٔ نادرست از پرانتز، براکت یا آکولاد
numbers = [1, 2, 3
print(numbers)پیام احتمالی:
SyntaxError: ']' was never closed- یادم رفتن کوتیشن در رشتهها
name = "Ali
print(name)پیام احتمالی:
SyntaxError: unterminated string literal- تایپکردن کلمات کلیدی اشتباه
pritn("سلام")
اینجا در واقع pritn نه تابع است، نه کلمهٔ کلیدی؛ بعداً بهصورت خطای دیگر (NameError) ظاهر میشود، اما بسیاری از IDE ها آن را همردهٔ خطاهای نحوی تشخیص میدهند.
چگونه خطای نحوی را تشخیص دهیم؟
- پیام خطا با
SyntaxErrorشروع میشود. - معمولاً خطی را نشان میدهد که از نظر پایتون «جایی است که اشتباه دیده».
- گاهی خطای واقعی در خط قبل رخ داده (مثلاً جا انداختن یک پرانتز یا کوما در خط بالاتر).
۲. خطاهای زمان اجرا (Runtime Errors / Exceptions)
گاهی کد از نظر نحوی درست است و پایتون شروع به اجرا میکند، اما در حین اجرا به مشکلی برمیخورد. این مشکلات را «استثنا» یا Exception مینامیم.
این نوع خطاها را معمولاً Runtime Error میگویند؛ یعنی خطایی که تنها در «زمان اجرا» معلوم میشود، نه در زمان نوشتن.
نمونههای رایج استثناها:
۲.۱. `NameError` – استفاده از متغیر ناشناخته
وقتی از نامی استفاده میکنید که تعریف نشده است:
print(age)پیام:
NameError: name 'age' is not definedرایجترین علتها:
- متغیر را تعریف نکردهاید.
- نام متغیر را اشتباه تایپ کردهاید.
- متغیر در محدودهٔ دیگری تعریف شده و اینجا در دسترس نیست (مربوط به مبحث «محدودهٔ متغیرها»).
۲.۲. `TypeError` – نوع دادهٔ نامعتبر برای یک عمل
وقتی یک عمل را روی نوع نادرست انجام دهید:
result = "5" + 3پیام:
TypeError: can only concatenate str (not "int") to strیا:
len(10)پیام:
TypeError: object of type 'int' has no len()معنایش: این عمل برای این نوع داده مجاز نیست.
۲.۳. `ValueError` – مقدار نامعتبر با نوع صحیح
وقتی نوع ظاهراً درست است، اما «مقدار» قابل قبول نیست. مثال کلاسیک:
age = int("سلام")پیام:
ValueError: invalid literal for int() with base 10: 'سلام'
نوع ورودی str است و تبدیل به int برای رشتهای که عدد نیست امکانپذیر نیست.
تفاوت TypeError و ValueError:
TypeError: نوع کلی اشتباه است (مثلاًintبه جایstr).ValueError: نوع درست است، ولی مقدار با انتظار تابع/عملگر نمیخواند.
۲.۴. `ZeroDivisionError` – تقسیم بر صفر
تقسیم عدد بر صفر از نظر ریاضی تعریف نشده و در پایتون خطا میدهد:
x = 10 / 0پیام:
ZeroDivisionError: division by zero۲.۵. `IndexError` – خارج شدن از محدودهٔ لیست (و سایر توالیها)
وقتی به اندیس (index) عنصری دسترسی میخواهید که وجود ندارد:
numbers = [1, 2, 3]
print(numbers[5])پیام:
IndexError: list index out of range۲.۶. `KeyError` – کلید ناموجود در دیکشنری
برای دیکشنریها، وقتی به کلیدی دسترسی میخواهید که ثبت نشده:
person = {"name": "Ali", "age": 20}
print(person["city"])پیام:
KeyError: 'city'۲.۷. `FileNotFoundError` – فایل پیدا نشد
وقتی بخواهید فایلی را باز کنید که وجود ندارد:
f = open("file_that_does_not_exist.txt")پیام:
FileNotFoundError: [Errno 2] No such file or directory: 'file_that_does_not_exist.txt'۲.۸. `ImportError` / `ModuleNotFoundError` – مشکل در وارد کردن ماژول
وقتی نام ماژول را اشتباه مینویسید یا نصب نشده است:
import numppyپیام:
ModuleNotFoundError: No module named 'numppy'یا:
from math import squarپیام:
ImportError: cannot import name 'squar' from 'math'۳. خطاهای منطقی (Logic Errors)
در این نوع خطاها، پایتون هیچ خطایی اعلام نمیکند. کد شما بدون مشکل اجرا میشود، اما نتیجه اشتباه است. اینها معمولاً سختترین خطاها برای پیدا کردن هستند، چون:
- پیامی روی صفحه ظاهر نمیشود.
- فقط خروجی با «انتظار شما» تفاوت دارد.
نمونهها:
۳.۱. استفاده از عملگر اشتباه
میخواهید مجموع دو عدد را بگیرید، اما اشتباهاً ضرب میکنید:
x = 5
y = 3
result = x * y # باید x + y مینوشتید
print(result) # خروجی: 15، در حالی که انتظار داشتید 8از نظر نحو و زمان اجرا هیچ ایرادی ندارد، اما «منطق برنامه» غلط است.
۳.۲. شرط اشتباه در `if`
فرض کنید میخواهید پیام بدهید اگر سن بزرگتر یا مساوی ۱۸ بود، اما اشتباهاً از < استفاده کردهاید:
age = 20
if age < 18:
print("اجازه ورود دارید") # منطق برعکس است!برنامه اجرا میشود، اما رفتارش بر خلاف نیت شماست.
۳.۳. حلقهای که به تعداد اشتباه تکرار میشود
مثلاً میخواهید ۱۰ بار پیام چاپ کنید، اما بهخاطر یک عدد اشتباه، فقط ۹ بار چاپ میشود:
for i in range(1, 10): # انتظار داشتید 1 تا 10 (شامل 10)
print(i)خروجی ۱ تا ۹ است، نه ۱ تا ۱۰.
۴. مقایسهٔ سه نوع خطای اصلی
| نوع خطا | چه زمانی رخ میدهد؟ | پایتون چه میگوید؟ | مثال کوتاه |
|---|---|---|---|
| خطای نحوی (SyntaxError) | قبل از شروع اجرا | برنامه اصلاً اجرا نمیشود | فراموشکردن : در if |
| خطای زمان اجرا (Exception) | حین اجرای برنامه | برنامه متوقف میشود و پیام خطا میدهد | تقسیم بر صفر، اندیس نامعتبر لیست |
| خطای منطقی (Logic Error) | حین اجرا، در منطق برنامه | پایتون ساکت است؛ خروجی اشتباه است | استفاده از * بهجای + |
۵. نکتههای عملی برای کار با انواع خطا
چند نکتهٔ کوتاه برای استفاده از دانستههای این فصل:
- همیشه نوع خطا را بخوانید
بخش اول پیام خطا (مثلSyntaxError،NameError،TypeError) سرنخ اصلی است. - همیشه خطی که پیام خطا نشان میدهد را بررسی کنید
اما یادتان باشد گاهی خطای واقعی در خط قبلی است (بهویژه در SyntaxError). - برای خطاهای منطقی، به خروجی اعتماد نکنید، آن را بررسی کنید
برای اطمینان، مقادیر میانی را باprintچک کنید یا تستهای کوچک بنویسید. - الگوی خطاها را بشناسید
بعد از مدتی، وقتیIndexErrorدیدید فوری به یاد میآورید که یک اندیس خارج از محدوده استفاده کردهاید. این شناخت روند اشکالزدایی را سریعتر میکند.
در بخشهای بعدی این فصل، یاد میگیرید چطور این خطاها را بخوانید، با try و except با برخی از آنها برخورد کنید، و با روشهای اشکالزدایی (debugging) خطاهای منطقی را هم پیدا کنید.