🐍 کتابخانه مرجع پایتون

⚠️ مدیریت خطا (Error Handling) در پایتون

خطاها (Errors) یا استثناها (Exceptions) بخش جدایی‌ناپذیر برنامه‌نویسی هستند. پایتون با استفاده از بلوک‌های try، except، else و finally به شما امکان می‌دهد خطاها را مدیریت کرده و از کرش کردن برنامه جلوگیری کنید.

🔹 انواع خطاهای رایج در پایتون

نوع خطا توضیح مثال
SyntaxError خطای نحوی (ساختار کد اشتباه است) print("Hello"
NameError متغیر تعریف نشده print(x) (x تعریف نشده)
TypeError عمل روی نوع داده نامناسب "2" + 2
IndexError اندیس خارج از محدوده [1,2,3][5]
KeyError کلید در دیکشنری وجود ندارد {"a":1}["b"]
ValueError مقدار نامناسب int("abc")
ZeroDivisionError تقسیم بر صفر 10 / 0

🔹 ساختار try/except

try:
    # کدی که ممکن است خطا دهد
    x = 10
    y = 0
    result = x / y
    print(f"Result: {result}")
except ZeroDivisionError:
    print("Error: Cannot divide by zero!")
except Exception as e:
    print(f"An unexpected error occurred: {e}")
⏳ برای اجرا دکمه را بزنید...

🔹 try/except/else

بلوک else زمانی اجرا می‌شود که خطایی رخ ندهد.

try:
    # کدی که ممکن است خطا دهد
    num = int(input("Enter a number: "))
except ValueError:
    print("Error: Invalid number!")
else:
    # این بخش فقط در صورت عدم وجود خطا اجرا می‌شود
    print(f"You entered: {num}")
    print(f"Square: {num ** 2}")

🔹 try/except/finally

بلوک finally همیشه اجرا می‌شود، حتی اگر خطا رخ دهد.

try:
    file = open("test.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("Error: File not found!")
finally:
    print("This block always executes.")

🔹 ایجاد خطا با raise

با raise می‌توانید به‌صورت دستی خطا ایجاد کنید.

def validate_age(age):
    if age < 0:
        raise ValueError("Age cannot be negative!")
    elif age > 150:
        raise ValueError("Age cannot be more than 150!")
    else:
        return f"Valid age: {age}"

try:
    print(validate_age(25))    # Valid
    print(validate_age(-5))    # Error
except ValueError as e:
    print(f"Error: {e}")
⏳ برای اجرا دکمه را بزنید...

🔹 ایجاد استثناهای سفارشی (Custom Exceptions)

# تعریف استثنای سفارشی
class InsufficientBalanceError(Exception):
    """Exception raised when account balance is insufficient."""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        self.message = f"Cannot withdraw {amount}. Balance is {balance}."
        super().__init__(self.message)

class BankAccount:
    def __init__(self, balance):
        self.balance = balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientBalanceError(self.balance, amount)
        self.balance -= amount
        return f"Withdrew {amount}. New balance: {self.balance}"

# استفاده
account = BankAccount(100)
try:
    print(account.withdraw(50))   # OK
    print(account.withdraw(80))   # Error
except InsufficientBalanceError as e:
    print(f"Error: {e}")
⏳ برای اجرا دکمه را بزنید...

🔹 assert (تأییدیه)

assert برای بررسی صحت یک شرط استفاده می‌شود و در صورت نادرست بودن، خطای AssertionError ایجاد می‌کند.

def divide(a, b):
    assert b != 0, "Divisor cannot be zero!"
    return a / b

try:
    print(divide(10, 2))  # 5.0
    print(divide(10, 0))  # AssertionError
except AssertionError as e:
    print(f"Assertion Error: {e}")
⏳ برای اجرا دکمه را بزنید...

🔹 ثبت خطا با logging

با ماژول logging می‌توانید خطاها را ثبت و مدیریت کنید.

import logging

# تنظیم logging
logging.basicConfig(
    level=logging.ERROR,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

try:
    result = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"Error occurred: {e}")
    print("Error logged. Check the log for details.")

# همچنین می‌توانید خطاهای سطح پایین‌تر را ثبت کنید
logging.warning("This is a warning message")
logging.info("This is an info message")
⏳ برای اجرا دکمه را بزنید...

🔹 مثال جامع: سیستم مدیریت کاربران

import logging

# تنظیم logging
logging.basicConfig(level=logging.ERROR)

class UserNotFoundError(Exception):
    pass

class UserManager:
    def __init__(self):
        self.users = {}

    def add_user(self, username, age):
        if not username:
            raise ValueError("Username cannot be empty!")
        if age < 0:
            raise ValueError("Age cannot be negative!")
        if username in self.users:
            raise KeyError(f"Username '{username}' already exists!")
        self.users[username] = age
        logging.info(f"User {username} added successfully.")

    def get_user(self, username):
        if username not in self.users:
            raise UserNotFoundError(f"User '{username}' not found!")
        return self.users[username]

    def delete_user(self, username):
        if username not in self.users:
            raise UserNotFoundError(f"User '{username}' not found!")
        age = self.users.pop(username)
        logging.info(f"User {username} (age {age}) deleted.")
        return age

# استفاده
manager = UserManager()

try:
    manager.add_user("Saba", 25)
    manager.add_user("Ali", 30)
    manager.add_user("Saba", 28)  # Duplicate username
except ValueError as e:
    print(f"Error: {e}")
except KeyError as e:
    print(f"Error: {e}")

# دریافت کاربر
try:
    print(manager.get_user("Saba"))   # 25
    print(manager.get_user("Hossein")) # Not found
except UserNotFoundError as e:
    print(f"Error: {e}")

# نمایش لیست کاربران
print("\nAll users:")
for username, age in manager.users.items():
    print(f"{username}: {age} years old")
⏳ برای اجرا دکمه را بزنید...

📌 نکات کلیدی

← قبلی: مدیریت فایل → بعدی: ماژول‌ها ↑ بازگشت به فهرست مقدماتی