مدیریت خطا (try-except)

اصلاح شده

2026-09-03

چرا لازمه؟

  • اگه ورودی/داده با نوع اشتباه وارد یک محاسبه بشه (مثلاً غیرعددی به‌جای عدد)، مفسر پایتون اجرای برنامه رو قطع می‌کنه
  • برای جلوگیری از کرش کردن برنامه، از try-except استفاده می‌شه

نحوه کار

  • کد داخل try اجرا می‌شه
  • اگه بدون خطا تموم بشه → بلوک except نادیده گرفته می‌شه
  • اگه استثنا (exception) رخ بده → اجرا از try خارج و به except می‌ره

مثال

inp = input('Enter Fahrenheit Temperature:')
try:
    fahr = float(inp)
    cel = (fahr - 32.0) * 5.0 / 9.0
    print(cel)
except:
    print('Please enter a number')
  • اگه کاربر عدد وارد کنه → تبدیل و محاسبه انجام می‌شه
  • اگه کاربر متن غیرعددی وارد کنه → float(inp) خطا می‌ده → پیام 'Please enter a number' چاپ می‌شه به‌جای کرش کردن برنامه

مدیریت خطاهای مشخص و نامشخص

try:
    number = int(input('Enter a number: '))
    print(10 / number)
except ValueError:
    print('That is not a valid number')
except ZeroDivisionError:
    print('You cannot divide by zero')
except Exception as e:
    print('Error:', str(e))

خطاهای رایج (Common Errors)

دسته زمان بروز مثال
خطای نحوی (Syntax) قبل از اجرا، حین خوندن کد فراموش کردن :
خطای زمان اجرا (Runtime) حین اجرای کد تقسیم بر صفر
خطای منطقی (Logical) کد اجرا می‌شه ولی نتیجه غلطه خطا نمی‌ده، باید خودمون پیدا کنیم

SyntaxError

  • ساختار کد با قواعد پایتون نمی‌خونه، اصلاً اجرا نمی‌شه
if True
    print('hello')
SyntaxError: expected ':'

IndentationError

  • تورفتگی (فاصله‌گذاری ابتدای خط) رعایت نشده
if True:
print('hello')
IndentationError: expected an indented block

NameError

  • استفاده از متغیر یا نامی که تعریف نشده
print(age)
NameError: name 'age' is not defined

TypeError

  • عملیات روی نوع‌های داده‌ی ناسازگار
result = '5' + 5
TypeError: can only concatenate str (not "int") to str

ValueError

  • نوع داده درسته ولی مقدارش برای عملیات مناسب نیست
number = int('abc')
ValueError: invalid literal for int() with base 10: 'abc'

IndexError

  • دسترسی به اندیسی خارج از محدوده‌ی لیست یا رشته
nums = [1, 2, 3]
print(nums[5])
IndexError: list index out of range

KeyError

  • دسترسی به کلیدی که در دیکشنری وجود نداره
person = {'name': 'Sara'}
print(person['age'])
KeyError: 'age'

AttributeError

  • صدا زدن متد یا ویژگی‌ای که برای اون نوع داده وجود نداره
number = 5
number.append(1)
AttributeError: 'int' object has no attribute 'append'

ZeroDivisionError

  • تقسیم هر عددی بر صفر
result = 10 / 0
ZeroDivisionError: division by zero

خواندن پیام خطا (Traceback)

  • آخرین خط پیام خطا، نوع خطا و دلیل رو نشون می‌ده
  • خط‌های بالاتر، مسیر اجرای کد تا رسیدن به خطا رو نشون می‌دن (از بیرونی‌ترین تا خط دقیق خطا)