Kahibaro
Discord Login Register

انواع خطاها

خطا در برنامه یعنی چه؟

در فصل «خطاها و اشکال‌زدایی» به‌طور کلی با مفهوم خطا آشنا شده‌اید. در این بخش روی یک موضوع خاص تمرکز می‌کنیم: انواع خطاها در پایتون و این‌که هر کدام چه نشانه‌هایی دارند.

شناخت نوع خطا کمک می‌کند:

در این فصل روی سه دستهٔ اصلی تمرکز می‌کنیم:

هرکدام را جداگانه می‌بینیم.


۱. خطاهای نحوی (Syntax Errors)

خطای نحوی یعنی کد شما از نظر «قانون‌های زبان پایتون» اشتباه است؛ یعنی پایتون حتی نمی‌تواند شروع به اجرای آن کند، چون «شکل» دستور غلط است.

مثال ساده:

print("سلام"

در اینجا پرانتز بسته نشده است. اگر این کد را اجرا کنید، پیامی شبیه این می‌بینید:

SyntaxError: '(' was never closed

ویژگی‌های خطای نحوی:

نمونه‌های رایج خطای نحوی:

  1. فراموش کردن دونقطه : در انتهای دستورهای کنترلی مثل if، for، while, def:
if x > 10
    print("بزرگتر از ۱۰ است")

پیام احتمالی:

SyntaxError: expected ':'
  1. استفادهٔ نادرست از پرانتز، براکت یا آکولاد
numbers = [1, 2, 3
print(numbers)

پیام احتمالی:

SyntaxError: ']' was never closed
  1. یادم رفتن کوتیشن در رشته‌ها
name = "Ali
print(name)

پیام احتمالی:

SyntaxError: unterminated string literal
  1. تایپ‌کردن کلمات کلیدی اشتباه
pritn("سلام")

اینجا در واقع pritn نه تابع است، نه کلمهٔ کلیدی؛ بعداً به‌صورت خطای دیگر (NameError) ظاهر می‌شود، اما بسیاری از IDE ها آن را هم‌ردهٔ خطاهای نحوی تشخیص می‌دهند.

چگونه خطای نحوی را تشخیص دهیم؟

۲. خطاهای زمان اجرا (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:

۲.۴. `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)حین اجرا، در منطق برنامهپایتون ساکت است؛ خروجی اشتباه استاستفاده از * به‌جای +

۵. نکته‌های عملی برای کار با انواع خطا

چند نکتهٔ کوتاه برای استفاده از دانسته‌های این فصل:

  1. همیشه نوع خطا را بخوانید
    بخش اول پیام خطا (مثل SyntaxError، NameError، TypeError) سرنخ اصلی است.
  2. همیشه خطی که پیام خطا نشان می‌دهد را بررسی کنید
    اما یادتان باشد گاهی خطای واقعی در خط قبلی است (به‌ویژه در SyntaxError).
  3. برای خطاهای منطقی، به خروجی اعتماد نکنید، آن را بررسی کنید
    برای اطمینان، مقادیر میانی را با print چک کنید یا تست‌های کوچک بنویسید.
  4. الگوی خطاها را بشناسید
    بعد از مدتی، وقتی IndexError دیدید فوری به یاد می‌آورید که یک اندیس خارج از محدوده استفاده کرده‌اید. این شناخت روند اشکال‌زدایی را سریع‌تر می‌کند.

در بخش‌های بعدی این فصل، یاد می‌گیرید چطور این خطاها را بخوانید، با try و except با برخی از آن‌ها برخورد کنید، و با روش‌های اشکال‌زدایی (debugging) خطاهای منطقی را هم پیدا کنید.

Views: 5

Comments

Please login to add a comment.

Don't have an account? Register now!