Kahibaro
Discord Login Register

خطاهای رایج و راه‌حل‌ها

Table of Contents

فهرست کلی خطاهای رایج

در این پیوست، روی خطاهایی تمرکز می‌کنیم که تقریبا همهٔ مبتدی‌ها در پایتون با آن‌ها برخورد می‌کنند و برای هرکدام، نمونه‌کد و راه‌حل پیشنهاد می‌کنیم. توضیح مفصل انواع خطا و try/except قبلا در فصل «خطاها و اشکال‌زدایی» آمده؛ این‌جا بیشتر شبیه یک برگهٔ تقلب برای «اوه باز هم این خطا!» است.

در این فصل این دسته خطاها را می‌بینید:

در هر بخش، الگوی «پیام خطا → چرا رخ داده → چگونه درستش کنیم» را دنبال می‌کنیم.


۱. خطاهای نحوی (SyntaxError و IndentationError)

۱.۱ فراموش‌کردن دونقطه `:`

خیلی رایج در if, for, while, def, class و غیره.

if x > 10
    print("بزرگ‌تر از ۱۰")

پیام معمول: SyntaxError: invalid syntax

راه‌حل: در انتهای خط دستورهای بلوکی، : بگذارید:

if x > 10:
    print("بزرگ‌تر از ۱۰")

همین اشتباه در for, while, def, elif, else, try, except, class هم تکرار می‌شود.


۱.۲ مشکل تو رفتگی (IndentationError)

یکی از شایع‌ترین خطاها:

if x > 10:
print("بزرگ‌تر از ۱۰")

پیام‌ها:

نکات و راه‌حل:

نسخهٔ درست:

if x > 10:
    print("بزرگ‌تر از ۱۰")

۱.۳ پرانتز، براکت، یا کوتیشن بسته‌نشده

پرانتز یا براکت ناقص

numbers = [1, 2, 3, 4
print(numbers)

پیام معمول: SyntaxError: '[' was never closed یا شبیه آن.

راه‌حل: جفت (), [], {} را کامل بررسی کنید:

numbers = [1, 2, 3, 4]
print(numbers)

رشتهٔ بسته‌نشده

text = "سلام دنیا
print(text)

راه‌حل: کوتیشن شروع و پایان هر رشته را چک کنید:

text = "سلام دنیا"
print(text)

۱.۴ استفادهٔ اشتباه از `=` و `==`

در شرط‌ها، گاهی به‌جای == از = استفاده می‌شود:

if x = 5:
    print("x پنج است")

پیام: SyntaxError: invalid syntax

راه‌حل: در شرط‌ها برای مقایسه از == استفاده کنید:

if x == 5:
    print("x پنج است")

= فقط برای نسبت‌دادن مقدار به متغیر است.


۲. NameError – استفاده از متغیر تعریف‌نشده

پیام: NameError: name 'x' is not defined

نمونه:

print(total)
total = 10

یا اشتباه تایپی:

total = 10
print(totla)

چرا رخ می‌دهد؟

راه‌حل‌ها:

  total = 10
  print(total)

۳. TypeError – نوع داده نامناسب

۳.۱ جمع‌کردن عدد با رشته

پیام پایه: TypeError: can only concatenate str (not "int") to str

نمونه:

age = 20
print("سن شما: " + age)

چرا؟ در پایتون نمی‌توانید مستقیم str و int را با + کنار هم بگذارید.

راه‌حل‌ها:

  age = 20
  print("سن شما: " + str(age))
  age = 20
  print(f"سن شما: {age}")

۳.۲ فراخوانی چیزی که قابل فراخوانی نیست

پیام: TypeError: 'int' object is not callable یا مشابه.

نمونهٔ رایج:

x = 5
x()

یا:

list = [1, 2, 3]
list()

چرا؟ فقط توابع (و بعضی اشیاء خاص) قابل «فراخوانی» با () هستند. int، list (شیء لیست، نه کلاس list) و … تابع نیستند.

راه‌حل:

  numbers = [1, 2, 3]     # بهتر از استفاده از نام list
  print(len(numbers))

۴. ValueError – مقدار نامعتبر

رایج‌ترین نمونه در تبدیل ورودی:

age = int(input("سن را وارد کنید: "))

اگر کاربر وارد کند: بیست → پیام:

ValueError: invalid literal for int() with base 10: 'بیست'

راه‌حل‌های ساده:

نمونهٔ کنترل خیلی ساده:

text = input("یک عدد وارد کنید: ")
if text.isdigit():
    number = int(text)
    print("عدد شما:", number)
else:
    print("لطفاً فقط رقم وارد کنید.")

۵. IndexError و KeyError

۵.۱ IndexError – دسترسی خارج از محدودهٔ لیست

پیام: IndexError: list index out of range

نمونه:

numbers = [10, 20, 30]
print(numbers[3])

لیست ۳ عنصر دارد؛ اندیس معتبر: 0, 1, 2. اندیس 3 وجود ندارد.

راه‌حل‌ها:

  idx = 3
  if idx < len(numbers):
      print(numbers[idx])
  else:
      print("اندیس نامعتبر است")

۵.۲ KeyError – کلید ناموجود در دیکشنری

پیام: KeyError: 'age'

نمونه:

person = {"name": "Ali"}
print(person["age"])

راه‌حل‌های رایج:

  if "age" in person:
      print(person["age"])
  else:
      print("سن تعریف نشده است.")
  age = person.get("age", "نامشخص")
  print(age)

۶. ZeroDivisionError – تقسیم بر صفر

پیام: ZeroDivisionError: division by zero

نمونه:

x = 10
y = 0
print(x / y)

راه‌حل‌های معمول:

  if y != 0:
      print(x / y)
  else:
      print("نمی‌توان بر صفر تقسیم کرد.")

۷. خطاهای رایج در ورودی/خروجی و فایل‌ها

۷.۱ FileNotFoundError – فایل پیدا نشد

پیام: FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

نمونه:

f = open("data.txt", "r")
content = f.read()
f.close()

دلایل معمول:

راه‌حل‌ها:

  with open("data.txt", "r", encoding="utf-8") as f:
      content = f.read()

۷.۲ PermissionError – مجوز ندارید

پیام: PermissionError: [Errno 13] Permission denied: 'file.txt'

نمونه‌های رایج:

راه‌حل:

۸. خطاهای رایج در شرط‌ها و حلقه‌ها

۸.۱ حلقهٔ بی‌نهایت ناخواسته

حلقه‌ای که هیچ‌وقت تمام نمی‌شود:

x = 0
while x < 5:
    print(x)
    # فراموش کردیم x را تغییر دهیم

برنامه تا ابد 0 چاپ می‌کند.

راه‌حل:

  x = 0
  while x < 5:
      print(x)
      x += 1

۸.۲ اشتباه در مقایسهٔ رشته‌ها و حروف کوچک/بزرگ

نمونه:

answer = input("بله یا خیر؟ ")
if answer == "بله":
    print("قبول شد")

اگر کاربر بله را با فاصله یا با حروف مختلف بنویسد، شرط برقرار نمی‌شود.

راه‌حل‌های ساده:

  answer = input("بله یا خیر؟ ").strip().lower()
  if answer == "بله":
      print("قبول شد")

۸.۳ استفادهٔ نادرست از عملگرهای منطقی

اشتباه رایج:

x = 5
if x == 1 or 2 or 3:
    print("x در بین ۱، ۲، ۳ است")

این کد تقریبا همیشه True است و اشتباه است.

راه‌حل‌های درست:

  if x in [1, 2, 3]:
      print("x در بین ۱، ۲، ۳ است")
  if x == 1 or x == 2 or x == 3:
      print("x در بین ۱، ۲، ۳ است")

۹. خطاهای رایج در توابع

۹.۱ فراموش‌کردن `return`

نمونه:

def add(a, b):
    c = a + b   # فراموش کردیم return کنیم
result = add(2, 3)
print(result)

خروجی: None

چرا؟ وقتی تابع return نداشته باشد، به‌طور پیش‌فرض None برمی‌گرداند.

راه‌حل:

def add(a, b):
    c = a + b
    return c
result = add(2, 3)
print(result)

۹.۲ تعداد آرگومان‌های اشتباه

پیام‌ها:

نمونه:

def greet(name):
    print("سلام", name)
greet()          # آرگومان ندادیم
greet("علی", 2)  # آرگومان اضافی دادیم

راه‌حل‌ها:

  def greet(name="دوست"):
      print("سلام", name)
  greet()
  greet("علی")

۱۰. چند نکته برای پیدا کردن و رفع سریع خطاها

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

  1. از پیام خطا نترسید. متن خطا را تا آخر بخوانید؛ نوع خطا (TypeError, NameError, …) معمولا مستقیما می‌گوید مشکل چه جنسی دارد.
  2. به شمارهٔ خط دقت کنید. در پیام خطا معمولا نوشته می‌شود خط چندم مشکل داشته؛ از همان‌جا شروع کنید.
  3. به چند خط قبل و بعد نگاه کنید. گاهی خطا در خط بعدی ظاهر می‌شود ولی ریشه در خط قبل دارد (مثلا پرانتز بسته‌نشده).
  4. چاپ مقادیر (print) را فراموش نکنید. اگر نمی‌دانید یک متغیر چه مقداری دارد، آن را چاپ کنید تا مطمئن شوید آن‌چه فکر می‌کنید هست یا نه.
  5. کد را کوچک کنید. اگر برنامهٔ شما بزرگ است، بخشی که خطا می‌دهد را جدا کنید و در یک اسکریپت کوچک تست کنید. پیدا کردن خطا در کد کوچک آسان‌تر است.
  6. از IDE یا ویرایشگر خوب استفاده کنید. بسیاری از خطاهای نحوی (مثل فراموش‌کردن : یا پرانتز) قبل از اجرا با رنگ یا علامت نشان داده می‌شوند.
  7. برای خطاهای تکراری، الگو بشناسید. مثلا اگر چند بار TypeError گرفته‌اید که می‌گوید int و str نمی‌شود با هم جمع شوند، بدانید هرجا + بین عدد و متن گذاشته‌اید ممکن است همین خطا را ببینید.

این پیوست برای زمانی است که با یک پیام خطای «آشنا ولی اعصاب‌خردکن» مواجه می‌شوید؛ می‌توانید نوع خطا را در این لیست پیدا کنید و الگو و راه‌حل معمولش را ببینید.

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!